代码之家  ›  专栏  ›  技术社区  ›  Sergio Nolazco

如果分组类别中特定列的值不同,则删除数据帧的行

  •  1
  • Sergio Nolazco  · 技术社区  · 8 年前

    我有一个巨大的数据帧,但这里有一个非常简单的示例:

    df <- data.frame(Id=c(rep("Mike",8)), Year=c(rep("2015",2),rep("2016",3),
                 rep("2017",3)),location=c(rep("A",2),rep("B",3),"D","E","E"))
    df
        #  Id   Year location
        #1 Mike 2015        A
        #2 Mike 2015        A
        #3 Mike 2016        B
        #4 Mike 2016        B
        #5 Mike 2016        B
        #6 Mike 2017        D
        #7 Mike 2017        E
        #8 Mike 2017        E
    

    我的分组标准是 Id Year ,因此对于特定的组(例如,Mike 2017),有许多行。我想删除组中“位置”因子不完全相等的所有行。

    在这种情况下,并非所有地点都相同的唯一一组是“Mike 2017”。然后,我想得到这样一个数据帧:

    #    Id Year location
    #1 Mike 2015        A
    #2 Mike 2015        A
    #3 Mike 2016        B
    #4 Mike 2016        B
    #5 Mike 2016        B
    

    有没有办法通过指明上述分组标准和排除标准来做到这一点?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Ronak Shah    8 年前

    我们可以 group_by Id Year 只选择每个组只有一个唯一值的行

    library(dplyr)
    df %>%
       group_by(Id, Year) %>%
       filter(n_distinct(location) == 1) %>%
       #To remove grouping from @AntoniosK in the comments
       ungroup()
    
    #    Id  Year  location
    #  <fct> <fct> <fct>   
    #1 Mike  2015  A       
    #2 Mike  2015  A       
    #3 Mike  2016  B       
    #4 Mike  2016  B       
    #5 Mike  2016  B     
    

    基本R版本使用 ave 会是

    df[with(df, ave(location, Id, Year, FUN = function(x) length(unique(x)))) == 1, ]
    

    正如@AntoniosK提到的,确保转换 location 使用字符 as.character 使用前 大道 选择。如果需要,你可以将它们转换回因子。