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

Remove rows of a dataframe if values from a specific column differ within a grouping category

我有一个巨大的数据框,但这是一个非常简单的例子:

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

我的分组标准是 IdYear,所以对于一个特定的组(例如 Mike 2017)有很多行。我想删除 "location" 个因子不完全相等的组中的所有行。

在这种情况下,唯一不是所有位置都相同的组是 "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

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

我们可以 group_by IdYear 和 select 只有那些每组只有一个唯一值的行

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     

使用 ave 的基本 R 版本将是

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

正如@AntoniosK 提到的,在使用 ave 选项之前,确保使用 as.characterlocation 转换为字符。如果需要,您可以将它们转换回因子。