如何 select r 中没有 NA 的最后一个测试

How to select the last one test without NA in r

我的数据框是这样的:

Person  W.1   W.2   W.3   W.4   W.5   
1       62    57    52    59    NA
2       49    38    60    NA    NA
3       59    34    NA    NA    NA

有没有办法 select 没有 "NA" 的第一个和最后一个测试。我有300个数据条目,W.1表示第一次测试,W.2表示第二次测试,W.n表示第n次测试。我想比较第一次测试的分数和最后一次测试的分数。比如我要比较:

1    62 59
2    49 60
3    59 34

但是不同的人有不同的地方"NA",谁能帮帮我?

谢谢!

这是一个使用 max.col 的可能的矢量化解决方案(我假设第一个测试永远不会 NA,但如果不是这样,它可以很容易地修复)

indx <- cbind(seq_len(nrow(df)), max.col(!is.na(df), ties.method = "last"))
cbind(df[, 2], df[indx])
#      [,1] [,2]
# [1,]   62   59
# [2,]   49   60
# [3,]   59   34

另一个类似的解决方案是使用rowSums

cbind(df[, 2], df[cbind(seq_len(nrow(df)), rowSums(!is.na(df)))])
#      [,1] [,2]
# [1,]   62   59
# [2,]   49   60
# [3,]   59   34

您可以使用此解决方案:

> t(apply(d[-1],1,function(rw) rw[range(which(!is.na(rw)))]))

     [,1] [,2]
[1,]   62   59
[2,]   49   60
[3,]   59   34

其中 d 是您的数据集。

工作原理:对于 d 的每一行(使用 apply(d[-1],1,...) 扫描行,其中 d[-1] 排除第一列),获取非 NA 测试结果的索引(which(!is.na(rw))),然后用range()得到指数的最低值和最高值,得到对应这些指数(rw[...])的考试成绩。最终结果使用t().

转置

请注意,即使在测试分数中间的 NA 的情况下,此解决方案也能正常工作,例如c(NA, 57, NA, 52, NA)