如何 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)
。
我的数据框是这样的:
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)
。