删除两个组中至少x%的值为零的行

时间:2017-11-16 20:29:19

标签: r

鉴于以下数据帧,我想删除至少一个组中至少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))

1 个答案:

答案 0 :(得分:0)

根据您的需要,如果某行超过3&#34; 0&#34;,则需要删除该行。

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

第10行被删除。