выбрать столбец во фрейме данных на основе NA в строках

Скажем, у меня есть фрейм данных из 7 столбцов, в некоторых строках есть 7 значений, а в других - NA после определенной точки. Я хочу получить последнее значение (слева направо), которое не является NA, а затем значение непосредственно слева. Это иерархические данные, но некоторые группы идут глубже, чем другие. Мне нужны самые глубокие и вторые самые глубокие группы в двух столбцах в новом фрейме данных.

Этот код работает, но мне не хватает памяти для кадра данных из 46 000 наблюдений. Есть ли более эффективный способ, о котором я не думаю?

df <- data.frame(LEVEL1 = c('animal', 'vegetable', 'mineral'),
                 LEVEL2 = c('mammal', 'pepper', 'rock'),
                 LEVEL3 = c('dog', 'jalepeno', NA),
                 LEVEL4 = c('westie', NA, NA))

deepest <- apply(df, 1, 
                  function(x) length(which(!is.na(x))))
one.up <- apply(df, 1, 
                    function(x) length(which(!is.na(x)))-1)
len <- nrow(df)
output <- data.frame(one.up = unlist(sapply(1:len, 
                            function(x) df[x, one.up[x]])),
                     deepest= unlist(sapply(1:len, 
                                            function(x) df[x, deepest[x]])))

Первый раз публикую. Обычно я могу собрать то, что мне нужно, на этом сайте. Заранее спасибо.


person Ben Hunter    schedule 04.06.2012    source источник


Ответы (2)


Я думаю, вы могли бы дважды запустить этот цикл с помощью простого вызова apply, например:

> apply(df, 1, function(x) {
+     n <- max(which(!is.na(x)))
+     x[(n-1):n]
+ })
     [,1]     [,2]       [,3]     
[1,] "dog"    "pepper"   "mineral"
[2,] "westie" "jalepeno" "rock"   
person daroczig    schedule 04.06.2012

Я не уверен, что ваш код выдаст то, что, по вашему мнению, должно быть, если NA могут быть вкраплены по длине строк (хотя вы говорите, что этого не должно происходить). Этот код остановится перед первым NA и вернет два предыдущих значения.

> output.m <- apply(df,1,function(x) { leng.na <-rle(is.na(x))$lengths[1]
                                       tail(x[1:leng.na],2) }  )
> output.d <- as.data.frame(t(output.m))
> output.d
       V1       V2
1     dog   westie
2  pepper jalepeno
3 mineral     rock
person IRTFM    schedule 04.06.2012
comment
Благодаря тонну. Я почти уверен, что в моих данных нет «внутренних» NA, но я не знал о функции rle. Это пригодится. - person Ben Hunter; 05.06.2012