2015-01-30 3 views
1

В следующем dataframeR манипулировать dataframe

df <- data.frame(ID = 1:3, 
      Col1 = c("a","b","c"), 
      Col2 = c("d", NA, "e"), 
      Col3 = c("f", NA, NA)) 
> df 
    ID Col1 Col2 Col3 
1 1 a d f 
2 2 b <NA> <NA> 
3 3 c e <NA> 

каждая строка представляет собой последовательность с различной длиной. Столбец 1 представляет первую позицию в каждой последовательности, колонку 2 - вторую позицию и так далее.
Целью является создание нового столбца, содержащего последнее значение, отличное от NA каждой последовательности. Полученный dataframe должен выглядеть следующим образом:

df$NewCol <- c("f","b","e") 
> df 
    ID Col1 Col2 Col3 NewCol 
1 1 a d f  f 
2 2 b <NA> <NA>  b 
3 3 c e <NA>  e 

Любые идеи, как выбрать последнюю позицию в каждой строке и назначить его на новый столбец?

Любая помощь приветствуется! Спасибо!

ответ

2

Попробуйте

df[cbind(seq_len(nrow(df)), rowSums(!is.na(df)))] 
## [1] "f" "b" "e" 

Это в основном подводит итог Non - NA последовательности и индексы этих столбцов в строке

Или, если вы предпочитаете делать это в цикле, может сделать

apply(df, 1, function(x) x[sum(!is.na(x))]) 
## [1] "f" "b" "e" 

Другой удобный вариант векторизации (предложенный @akrun) использует max.col

df[cbind(seq_len(nrow(df)), max.col(!is.na(df), 'last'))] 
## [1] "f" "b" "e"