【发布时间】:2020-01-07 00:33:50
【问题描述】:
我在 R 中有一个数据框。对于每个条目,我有 10 列值,最后一列指示条目所属的组(A 组、B 组、C 组等)
我需要做的是:
1 ) 删除超过 20% 的条目等于 0 的所有列
和
2) 删除任一组中超过 20% 的值为 0 的所有列。更糟糕的是,我只想单独保留每个组至少有 20% 非零的列。
你能帮忙吗:-s
谢谢!
【问题讨论】:
我在 R 中有一个数据框。对于每个条目,我有 10 列值,最后一列指示条目所属的组(A 组、B 组、C 组等)
我需要做的是:
1 ) 删除超过 20% 的条目等于 0 的所有列
和
2) 删除任一组中超过 20% 的值为 0 的所有列。更糟糕的是,我只想单独保留每个组至少有 20% 非零的列。
你能帮忙吗:-s
谢谢!
【问题讨论】:
我们可以在逻辑向量上使用colMeans
df1[colMeans(df1 == 0) < 0.2]
如果它基于“组”
nm1 <- setdiff(names(df1), "group")
i1 <- !Reduce(`|`, lapply(split(df1[nm1], df1$group),
function(x) colMeans(x == 0) >= 0.2))
df1[c("group", names(which(i1)))]
或者使用dplyr
library(dplyr)
df1 %>%
select_if(~ mean(. == 0) < 0.2)
有了分组,就可以了
df1 %>%
group_by(group) %>%
summarise_at(vars(-group_cols()), ~ mean(.==0) >= 0.2) %>%
summarise_at(-1, any) %>%
select_if(~ !.) %>%
names %>%
select(df1, group, .)
df1 <- data.frame(group = rep(c("A", "B", "C"), each = 5),
col1 = c(0, 0, 0, 1, 2, 0, 5, 3, 0, 0, 1:5), col2 = 1:15, col3 = c(0, 1:14) )
【讨论】: