我有一个包含许多行的数据框(例如下面的示例中的4行),每行都有一定数量的列与之关联,如下所示:
1 91 90 20
2 21 NA NA
3 20 20 NA
4 30 NA NA
最左边的数字1,2,3和4是行ID。我需要在所有关联列中提取包含多个数字的行。所以我期望的是:
1 91 90 20
3 20 20 NA
我尝试使用"其中"与" lapply"结合使用但这只是输出TRUE或FALSE,而我需要上面的实际值。
答案 0 :(得分:2)
您可以将rowSums
结合使用,只检查是否存在na,并过滤到大于1。
df[rowSums(!is.na(df)) > 1,]
<强>故障:强>
df <- data.frame(x = c(91, 21, 20, 30), y = c(90, NA, 20, NA), z = c(20, NA, NA, NA))
我们可以通过以下方式将其转换为T / F矩阵:
!is.na(df)
x y z
[1,] TRUE TRUE TRUE
[2,] TRUE FALSE FALSE
[3,] TRUE TRUE FALSE
[4,] TRUE FALSE FALSE
这显示了有和没有数字的位置。现在我们只需要总结行:
rowSums(!is.na(df))
[1] 3 1 2 1
这会产生每行非NA条目数。现在我们可以通过只查找超过1的那些来将其改回逻辑向量:
rowSums(!is.na(df)) > 1
[1] TRUE FALSE TRUE FALSE
现在用以下内容对df进行子集化:
df[rowSums(!is.na(df)) > 1,]
x y z
1 91 90 20
3 20 20 NA