我正在使用这个data.frame
。我需要通过将“0”组与“1”组进行比较来对每列应用统计测试 (wilcox.test
),但只有当每个组至少有 2 个值时我才能这样做。如何删除组大小“0”或组大小“1”小于 2 的所有列?然后我就可以毫无错误地运行我的代码。因此,在此示例中,pear
和 cherry
列将被删除。
df <- data.frame(group=c(rep(0,10),rep(1,10)),
apple = as.numeric(c(runif(20, -1, 18))),
pear = as.numeric(c(rep("NA",12), runif(8, 2, 7))),
banana = as.numeric(c(runif(10, 1, 3), runif(10, 2.5, 6))),
cherry = as.numeric(c(runif(9, 5, 12), rep("NA",10), 4.31)),
kiwi = as.numeric(c(rep("NA",8), runif(12, -1, 6))))
最佳答案
您可以使用 select
+ where
来通过函数选择变量。我预计使用 select
和 group_by
来处理这个问题,但 dplyr
似乎无法支持这一点。因此,解决方法是使用 tapply
(或 ave
)进行分组:
library(dplyr)
df %>%
select(where(~ all(tapply(.x, df$group, \(x) sum(!is.na(x)) >= 2))))
group apple banana kiwi
1 0 7.9768511 1.183422 NA
2 0 -0.6611309 1.948172 NA
3 0 0.6690410 1.556230 NA
4 0 1.3582682 1.063583 NA
5 0 4.5359535 2.972903 NA
6 0 8.8755979 2.074685 NA
7 0 2.9280202 1.734720 NA
8 0 7.4065231 1.460041 NA
9 0 0.8837726 1.109268 1.54898128
10 0 -0.9704649 2.447073 4.27753379
11 1 3.2403002 4.839462 -0.88546624
12 1 0.4561026 4.703763 2.50467817
13 1 10.2888012 3.920268 2.62292534
14 1 3.4619229 3.010228 4.67953823
15 1 0.2207555 5.582971 3.71465882
16 1 -0.3694006 3.326906 4.17280678
17 1 13.1442999 3.018943 3.39256613
18 1 6.7433707 2.989773 0.04379258
19 1 16.0372570 2.839262 4.41795547
20 1 15.7012046 2.982483 3.13632483
关于通过两个不同列中的两个条件删除 R 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73301581/