R 操纵数据帧
在下面的数据帧中R 操纵数据帧,r,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&
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>
df
ID Col1 Col2 Col3
1 a d f
2 b
3 c e
每行代表一个长度不同的序列。第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
df$NewCol-df
ID Col1 Col2 Col3 NewCol
1 a d f f
2乙
3 c e e
你知道如何选择每行的最后一个位置并将其分配给新列吗
感谢您的帮助!
谢谢 试试这个
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"