R操纵数据帧

时间:2015-01-30 12:53:44

标签: r

在以下数据框中

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以外的最后一个值。生成的数据框应如下所示:

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

如何选择每行中的最后一个位置并将其分配给新列?

任何帮助表示赞赏! 谢谢!

1 个答案:

答案 0 :(得分:2)

试试这个

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

这基本上总结了非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"