【问题标题】:Remove rows where at least x percent of the values are zero in both groups删除两组中至少 x% 的值为零的行
【发布时间】: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("&amp;", lapply(split.default(df[-1], colnames(df)[-1]), function(a) rowSums(a &gt; 0) &gt; (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


【解决方案1】:

根据你的需要,如果一行有超过3个“0”,你想删除该行。

rownames(df) <- df[,1]
df <- df[,-1]
df <- df[apply(df, 1, FUN = function(x){sum(x == 0)}) < 3,]

第 10 行已删除。

【讨论】:

  • 不是真的,请参阅我对上一个答案的最后评论。
猜你喜欢
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
相关资源
最近更新 更多