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

如果另一列上出现零值,请删除带因子的行

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

    我的数据框如下所示:

    structure(list(intype = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
    3L, 3L), .Label = c("A30", "A31", "E45"), class = "factor"), 
        inerror = c(0.54, 0.14, 0.94, 0, 2.11, 0, 1.42, 3.19, 0), 
        inmethod = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L
        ), .Label = c("A", "B", "C"), class = "factor")), row.names = c(NA, 
    -9L), class = "data.frame")
    
    +--------+---------+----------+
    | intype | inerror | inmethod |
    +--------+---------+----------+
    | A30    |    0.54 | A        |
    | A30    |    0.14 | B        |
    | A30    |    0.94 | C        |
    | A31    |    9.20 | A        |
    | A31    |    2.11 | B        |
    | A31    |   -1.55 | C        |
    | E45    |    1.42 | A        |
    | E45    |    3.19 | B        |
    | E45    |    0.00 | C        |
    +--------+---------+----------+
    

    Intype 这是一个因素。 我想删除因子中的所有行,如果 inerror<=0

    因此,生成的数据帧将是:

    +--------+---------+----------+
    | intype | inerror | inmethod |
    +--------+---------+----------+
    | A30    |    0.54 | A        |
    | A30    |    0.14 | B        |
    | A30    |    0.94 | C        |
    +--------+---------+----------+
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Ronak Shah    6 年前

    有多种方法可以做到这一点

    library(dplyr)
    df %>%
      group_by(intype) %>%
      filter(all(inerror > 0))
    
    # intype inerror inmethod
    #  <fct>    <dbl> <fct>   
    #1 A30       0.54 A       
    #2 A30       0.14 B       
    #3 A30       0.94 C    
    

    或者是倒过来的

    df %>%
      group_by(intype) %>%
      filter(!any(inerror <= 0))
    

    ave

    subset(df, ave(inerror > 0, intype, FUN = all))   
    #and
    subset(df, !ave(inerror <= 0, intype, FUN = any))      
    
        2
  •  2
  •   jay.sf    6 年前

    这也在起作用。

    with(dat, dat[- which(intype %in% intype[inerror <= 0]), ])
    

    或者,更短(thx )

    with(dat, dat[!intype %in% intype[inerror <= 0], ]) 
    

    #   intype inerror inmethod
    # 1    A30    0.54        A
    # 2    A30    0.14        B
    # 3    A30    0.94        C
    

    为了消除过时的因子水平,还需要使用 droplevels

    dat$intype <- droplevels(dat$intype)