我有一个数据框,其中每一行都是不同长度值的向量。我想在每一行中创建一个最后一个真值的向量。
以下是一个示例数据框:
df <- read.table(tc <- textConnection("
var1 var2 var3 var4
1 2 NA NA
4 4 NA 6
2 NA 3 NA
4 4 4 4
1 NA NA NA"), header = TRUE); close(tc)
我想要的值向量因此是c(2,6,3,4,1)
。
我无法弄清楚如何让R识别最后一个值。
感谢任何帮助!
答案 0 :(得分:15)
通过结合三件事来做到这一点:
NA
is.na
值
tail
apply
将此功能应用于data.frame
代码:
lastValue <- function(x) tail(x[!is.na(x)], 1)
apply(df, 1, lastValue)
[1] 2 6 3 4 1
答案 1 :(得分:1)
以下是使用矩阵子集的答案:
df[cbind( 1:nrow(df), max.col(!is.na(df),"last") )]
此max.col
调用将选择每行中最后一个非NA值的位置(如果它们都是NA,则选择第一个位置)。
答案 2 :(得分:0)
这是另一个版本,在获取反向输入的第一个元素之前删除所有无穷大,NA和NaN:
apply(df, 1, function(x) rev(x[is.finite(x)])[1] )
# [1] 2 6 3 4 1