【发布时间】:2017-11-16 20:29:19
【问题描述】:
鉴于以下数据框,我想删除至少一组中至少有 x%(例如 50%)的值 = 0 的所有行。
例如,如果一行在两组(控制组和治疗组)中的值都低于 50%,那么它将被删除。
如果该行在组控制(或治疗)中具有 50% 的非零值,而在另一组中没有值,则将保留该行,因为仍有一组具有至少 50% 的值。
希望很清楚。
treatment control control treatment control treatment
row1 0 21 21 21 45 34
row2 0 21 78 321 93 0
row3 34 32 98 87 34 0
row4 75 21 12 54 45 34
row5 46 21 13 45 0 0
row6 85 21 87 45 0 23
row7 24 84 0 0 45 5
row8 87 21 0 98 87 76
row9 43 2 0 45 12 9
row10 12 12 0 0 23 0
在数据框下方
df <- structure(list(structure(c(1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
2L), .Label = c("row1", "row10", "row2", "row3", "row4", "row5",
"row6", "row7", "row8", "row9"), class = "factor"), treatment = c(0L,
0L, 34L, 75L, 46L, 85L, 24L, 87L, 43L, 12L), control = c(21L,
21L, 32L, 21L, 21L, 21L, 84L, 21L, 2L, 12L), control = c(21L,
78L, 98L, 12L, 13L, 87L, 0L, 0L, 0L, 0L), treatment = c(21L,
321L, 87L, 54L, 45L, 45L, 0L, 98L, 45L, 0L), control = c(45L,
93L, 34L, 45L, 0L, 0L, 45L, 87L, 12L, 23L), treatment = c(34L,
0L, 0L, 34L, 0L, 23L, 5L, 76L, 9L, 0L)), .Names = c("", "treatment",
"control", "control", "treatment", "control", "treatment"), class = "data.frame", row.names = c(NA,
-10L))
【问题讨论】:
-
df[Reduce("&", lapply(split.default(df[-1], colnames(df)[-1]), function(a) rowSums(a > 0) > (ncol(a)/2))),] -
谢谢,它确实按预期工作。一个简单的问题,如果我想使用 50% 以外的其他值,比如说每组的 66% 怎么办??
-
刚刚意识到在我的原始数据集中我的组是不平衡的。我有 10 个对照和 20 个治疗。那样不行吗??
-
你能提供一两行的预期结果吗?比如 row1 或 row2 是否应该包含在最终输出中?
-
在上面的示例中,仅删除了第 10 行:treatment = 12 , 0, 0(2/3 为 0 = 66%)。控制有 = 12,0,23(1/3 是 0 = 33%)。因此,对于第 10 行,我们有一组 66% 的 0(组治疗)和 33% 的 0 在组控制中。由于两组均未超过 50% 阈值,因此该行被丢弃。
标签: r