Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 操纵数据帧_R - Fatal编程技术网

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"