R 基于多个条件删除重复值
我需要帮助根据几个条件筛选出值 假设有一个城市与两个不同的县重叠,所以有两个不同的值。第二个值是同一个城市,但人口较少,表示该城市与第二个县重叠。所以变量包括城市、人口、学区、学区支出、犯罪率等,我想保留一个城市和一个学区唯一的所有值(因此对城市的观察可能会重复),但我不想在表示县重叠时对同一个城市进行两次观察(因为到时候我的人口会减少,这将是错误的陈述,并且会破坏其他一切)。使事情复杂化的是,城市也会逐年重复(因为我想保持我的dput简短,你将看不到这一点) 所以R 基于多个条件删除重复值,r,dplyr,R,Dplyr,我需要帮助根据几个条件筛选出值 假设有一个城市与两个不同的县重叠,所以有两个不同的值。第二个值是同一个城市,但人口较少,表示该城市与第二个县重叠。所以变量包括城市、人口、学区、学区支出、犯罪率等,我想保留一个城市和一个学区唯一的所有值(因此对城市的观察可能会重复),但我不想在表示县重叠时对同一个城市进行两次观察(因为到时候我的人口会减少,这将是错误的陈述,并且会破坏其他一切)。使事情复杂化的是,城市也会逐年重复(因为我想保持我的dput简短,你将看不到这一点) 所以 dat%>%不同(城市、学区
dat%>%不同(城市、学区、年份。保留全部=真)
这会给我带来所有独特的价值观,但仍然有两个问题:1)我想确保更多的人口是被保留的(除非重叠接近一半…人口可能超过30%),2)第二个县的城市的其他部分可能会进入另一个学区,在这种情况下,它仍然会被记录为与我的当前代码不同
然后我可以再次运行distinct…作为dat%>%distinct(城市,年份,.keep all=TRUE),但我也会清除那些重复观察代表不同学区的城市,我不能按学区进行distinct,因为有些学区可能有多个城市参加。因此,我认为以更大的人口为条件是一条可行的道路,但我不确定如何做到这一点
我发现这个帖子:
并尝试了类似的方法,但没有效果:
dat%>%
group_by(PLACE_ID, COUNTY_ID, full_district_id, year)%>%
mutate(n = n())%>%
arrange(PLACE_ID, year, desc(n)) %>%
ifelse(n>1, distinct(PLACE_ID,.keep_all = TRUE, PLACE_ID)%>%
ungroup()
我得到这个错误:
Error in ifelse(., n > 1, distinct(PLACE_ID, .keep_all = TRUE), PLACE_ID) : unused argument (PLACE_ID)
非常感谢
这里是dput(请注意,重复的两个值都应该保留,因为它是同一个城市不同的学区;我找不到重复我不想要的城市值的例子,因为这非常接近我问题的答案)
dat%>%groupby(地点ID、县ID、完整地区ID、年份)%>%slice(which.max(POPULATION.EST))
将选择每组中最大POPULATION.EST
的行。谢谢,Ronak。我试过了。代码似乎删除了很多值(170000个值中的近50000个)。我知道slice是slice(1:10)的意思,也就是挑选行;我不知道它也可以与group_by…一起使用,这是一个巧妙的用法。但它不可能删除其他值吗?我只是想确定一下。实际上我不明白你选择行的标准是什么。使用slice
和which.max
我们只得到每组人口的最大行数。dat%>%groupby(PLACE\u ID,country\u ID,full\u district\u ID,year)%%>%slice(which.max(Population.EST))
将选择每组人口的最大行数Population.EST
。谢谢,Ronak。我试过了。代码似乎删除了很多值(170000个值中的近50000个)。我知道slice是slice(1:10)的意思,也就是挑选行;我不知道它也可以与group_by…一起使用,这是一个巧妙的用法。但它不可能删除其他值吗?我只是想确定一下。实际上我不明白你选择行的标准是什么。使用slice
和which.max
我们只得到每组人口的最大行数。
structure(list(PLACE_ID = c("0100124", "0100460", "0101228",
"0101708", "0102116", "0102260", "0102320", "0102320", "0102836",
"0102860"), CITY = c("abbeville", "adamsville", "aliceville",
"andalusia", "arab", "ardmore", "argo", "argo", "ashford", "ashland"
), COUNTY_ID = c("01067", "01073", "01107", "01039", "01095",
"01083", "01073", "01115", "01069", "01027"), full_district_id = c("0101740",
"0101920", "0102730", "0100060", "0100100", "0102100", "0101920",
"0103062", "0101770", "0100750"), POPULATION.EST = c(2882, 4841,
2581, 8901, 7503, 1042, 2692, 2692, 1905, 2035), year = c(2003,
2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003), EXPENDITURE_PER_STUDENT = c(6.91392685629849,
5.93085371942087, 6.58799048751486, 6.23839541547278, 5.89238165680473,
6.22123450607237, 5.93085371942087, 5.45296752519597, 5.5939837398374,
6.11974248927039), CRIME_TOTAL = c(105, 365, 4, 734, 632, 19,
44, 44, 26, 14)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-10L))