这个问题在这里已有答案:
我有一个包含许多行的数据框(在下面的示例中为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
我尝试将“which”与“lapply”结合使用,但这只是给我TRUE或FALSE作为输出,而我需要如上所述的实际值。
你可以通过使用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