代码之家  ›  专栏  ›  技术社区  ›  Panos Kalatzantonakis

当因子的所有级别上都显示零时,删除列上具有零值的行

  •  1
  • Panos Kalatzantonakis  · 技术社区  · 6 年前

    我想在同一个团队的所有方法上出现零值行时过滤掉它们。

    例如,在下面的例子中 team One 错误为零,因此需要删除行1、4和7。 所以如果 alpha=beta=gamma=0 特定 team 然后应该删除那些带零的行。

    +----+-------+-------+--------+
    | id | team  | error | method |
    +----+-------+-------+--------+
    |  1 | One   |     0 | alpha  |
    |  2 | Two   |   5.7 | alpha  |
    |  3 | Three |     0 | alpha  |
    |  4 | One   |     0 | beta   |
    |  5 | Two   |     0 | beta   |
    |  6 | Three |     0 | beta   |
    |  7 | One   |     0 | gamma  |
    |  8 | Two   |     0 | gamma  |
    |  9 | Three |   6.7 | gamma  |
    +----+-------+-------+--------+
    

    结果表应为:

    +----+-------+-------+--------+
    | id | team  | error | method |
    +----+-------+-------+--------+
    |  2 | Two   |   5.7 | alpha  |
    |  3 | Three |     0 | alpha  |
    |  5 | Two   |     0 | beta   |
    |  6 | Three |     0 | beta   |
    |  8 | Two   |     0 | gamma  |
    |  9 | Three |   6.7 | gamma  |
    +----+-------+-------+--------+
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Mankind_2000    6 年前

    假设初始数据帧为 df ,如果有,请过滤 error 在里面 team 组为非零:

    library(dplyr)
    df %>% group_by(team) %>% 
           filter(any(error!=0))
    
        2
  •  1
  •   akrun    6 年前

    按“团队”分组后,我们可以检查 sum 逻辑向量法( error != 0 )大于0,即至少有一个非零元素

    library(dplyr)
    df %>% 
       group_by(team) %>% 
       filter(sum(error !=0 ) > 0)
    

    ==

    df %>%
       group_by(team) %>%
       filter(sum(error == 0) < n())
    

    数据

    df <- structure(list(id = 1:9, team = c("One", "Two", "Three", "One", 
     "Two", "Three", "One", "Two", "Three"), error = c(0, 5.7, 0, 
     0, 0, 0, 0, 0, 6.7), method = c("alpha", "alpha", "alpha", "beta", 
     "beta", "beta", "gamma", "gamma", "gamma")), class = "data.frame", 
     row.names = c(NA, -9L))
    
        3
  •  1
  •   lebatsnok    6 年前

    subset(df, ave(error, team)!=0)
    

    这过滤掉了所有的水分 team s的平均误差等于零。。。并且可能会有问题,例如,如果 error (比如, c(-1, -2, 3) ).

    因此,更一般的情况是

    subset(df, !ave(error, team, FUN=function(x) all(x==0)))
    

    .. 或者使用akrun回答中的想法:

    subset(df, ave(error %in% 0, team) < 1)