如何使用 R 中的 dplyr 根据跨越多列的标准过滤数据框
How to filter data frame based on criteria spanning multiple columns using dplyr in R
我有一个包含 92 个变量和 1900 个观测值的数据框。
本质上,我将物种 ID 作为我感兴趣的变量,并将相对丰度作为其他变量。
列69:92(23 列)是质量控制变量,范围为 0-10。
我想过滤我的数据,以便每个物种至少有 4 个大于 5 的质量控制变量。到目前为止我想出的最好的事情不是我想要的,但至少在我有至少 1 个 QC>5 的变量并且行的总和大于 100:[=12 的基础上过滤数据=]
df_QC <- df %>%
filter_at(vars(contains("QC")), any_vars(. >= 5))%>%
rowwise()%>%
mutate(total = sum(c_across(69:92)))
filter(total >99.9)
有没有办法按照我喜欢的方式解决它?
重申一下,如果 QC> 5,我想 select 对至少 4 个 QC 变量进行分类。
我的数据有点大,所以让我们处理一个较小的数据集来重现这个问题。虹膜数据,但添加一些质量控制变量:
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
...
我有一个包含 92 个变量和 1900 个观测值的数据框。 本质上,我将物种 ID 作为我感兴趣的变量,并将相对丰度作为其他变量。
列69:92(23 列)是质量控制变量,范围为 0-10。 我想过滤我的数据,以便每个物种至少有 4 个大于 5 的质量控制变量。到目前为止我想出的最好的事情不是我想要的,但至少在我有至少 1 个 QC>5 的变量并且行的总和大于 100:[=12 的基础上过滤数据=]
df_QC <- df %>%
filter_at(vars(contains("QC")), any_vars(. >= 5))%>%
rowwise()%>%
mutate(total = sum(c_across(69:92)))
filter(total >99.9)
有没有办法按照我喜欢的方式解决它?
重申一下,如果 QC> 5,我想 select 对至少 4 个 QC 变量进行分类。
我的数据有点大,所以让我们处理一个较小的数据集来重现这个问题。虹膜数据,但添加一些质量控制变量:
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
...