У меня есть список векторов, среди которых есть NA
. Мне нужно использовать lapply
для выбора предпоследнего элемента каждого вектора. Проблема в том, что NAs
имеют длину 1, поэтому я не могу получить доступ к их предпоследнему элементу.
MyList <- list(a=c("a","b","c"),b=NA,c=c("d","e","f"))
VectorFromList <- unlist(lapply(MyList, function(x) return(x[length(x)-1])))
VectorFromList
a c
"b" "e"
Как видите, результирующий вектор короче исходного списка ввода, что является проблемой, если я хочу добавить его как столбец в более длинный фрейм данных. Мой ожидаемый результат - вектор той же длины, что и исходный список:
[1] "a" NA "c"
Что делать с NAs
при использовании lapply
для выбора подэлементов в списке?
Всегда ищите хотя бы первый ... здесь можно использовать max
:
unlist(lapply(MyList, function(x) return(x[max(1,length(x)-1)])))
# a b c
# "b" NA "e"
или альтернативно
sapply(MyList, function(x) return(x[max(1,length(x)-1)]))
mapply(`[[`, MyList, pmax(1, lengths(MyList)-1))