在以下数据框中
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
如何选择每行中的最后一个位置并将其分配给新列?
任何帮助表示赞赏! 谢谢!
答案 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"