如果来自特定列的值在分组类别中不同,则删除数据框的行
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
我的分组标准是 Id
和 Year
,所以对于一个特定的组(例如 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
Id
和 Year
和 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.character
将 location
转换为字符。如果需要,您可以将它们转换回因子。
我有一个巨大的数据框,但这是一个非常简单的例子:
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)有很多行。我想删除 "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
Id
和 Year
和 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.character
将 location
转换为字符。如果需要,您可以将它们转换回因子。