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

问题描述 投票:0回答:1

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

r
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.