在R中的所有列中选择具有多个数字的条目

时间:2018-01-30 20:03:09

标签: r

我有一个包含许多行的数据框(例如下面的示例中的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,而我需要上面的实际值。

1 个答案:

答案 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