r - 如何使用 R 中的 dplyr 根据跨多列的条件过滤数据框

标签 r dplyr tidyverse

我有一个包含 92 个变量和 1900 个观察值的数据框。 本质上,我将物种 ID 作为我感兴趣的变量,并将相对丰度作为其他变量。

第 69:92 列(23 列)是质量控制变量,范围为 0-10。 我想过滤我的数据,以便每个物种至少有 4 个大于 5 的质量控制变量。到目前为止,我想出的最好的办法不是我想要的,但至少根据我至少有 1 个 QC>5 的变量并且行的总和大于 100 来过滤数据:

df_QC <-  df %>%
  filter_at(vars(contains("QC")), any_vars(. >= 5))%>% 
  rowwise()%>% 
  mutate(total = sum(c_across(69:92)))
  filter(total >99.9) 

有办法按照我想要的方式解决这个问题吗?

重申一下,如果至少 4 个 QC 变量的 QC > 5,我想选择物种。

我的数据有点大,所以让我们使用较小的数据集来重现问题。虹膜数据,但添加一些质量控制变量:

df <-cbind(iris, data.frame(qc1 = sample(0:10, size=150, replace=TRUE),
                            qc2 = sample(0:10, size=150, replace=TRUE),
                            qc3 = sample(0:10, size=150, replace=TRUE),
                            qc4 = sample(0:10, size=150, replace=TRUE),
                            qc5 = sample(0:10, size=150, replace=TRUE)))

#Then similarly I would do a filtering that is not really what I want:

df_QC <-  df %>%
  filter_at(vars(contains("QC")), any_vars(. >= 5))%>% 
  rowwise()%>% 
  mutate(total = sum(c_across(6:10)))%>%
filter(total >15) 

因此,通过此示例数据,我如何过滤掉至少 3 个 QC 的 QC>5 物种?

预先感谢您的帮助!

最佳答案

这里有一种使用 rowSums 来完成此操作的方法。基本上计算每行 >= 5 的值的数量,并检查该数字是否大于或等于 4。

dplyr

library(dplyr)
df %>% 
  filter(rowSums(.[str_c("qc", 1:5)] >= 5) >= 4)

基础R

df[rowSums(df[paste0("qc", 1:5)] >= 5) >= 4, ]

输出

   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species qc1 qc2 qc3 qc4 qc5
1           4.8         3.4          1.6         0.2     setosa   6   9   5  10  10
2           5.8         4.0          1.2         0.2     setosa   9   8   3   7   5
3           5.7         3.8          1.7         0.3     setosa   4  10   9   7   7
4           5.1         3.3          1.7         0.5     setosa   7   6  10   1   7
5           4.8         3.4          1.9         0.2     setosa   1   6   6   7   7
6           5.2         3.5          1.5         0.2     setosa   5   1   6   6   7
7           5.5         3.5          1.3         0.2     setosa  10   3   6   6   6
8           4.9         3.6          1.4         0.1     setosa   8   4  10   8   6
9           4.4         3.0          1.3         0.2     setosa   1   8   5   6  10
10          5.0         3.5          1.3         0.3     setosa   9   9   5   9   1
...

关于r - 如何使用 R 中的 dplyr 根据跨多列的条件过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71768238/

相关文章:

r - 多个列表上多个变量的统计检验(tibble)

r - 结合过滤器、跨和 starts_with 以跨 R 中的列进行字符串搜索

r - 未缩放预测系数 lmer 模型适合未缩放的响应

java - 使用 JRI 从 Java 调用 R,如何转换返回值

r - R "undefined columns selected"中的错误

r - 遍历列的唯一值并创建多个列

r - 导出到 R 中列表的 JSON 列表

r - 为 data.frame 和 tbl_df 子集行和列

r - 如何整齐地组合稀疏列

r - 使用 collapse R 包按组计算观察值