Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于多个条件删除重复值_R_Dplyr - Fatal编程技术网

R 基于多个条件删除重复值

R 基于多个条件删除重复值,r,dplyr,R,Dplyr,我需要帮助根据几个条件筛选出值 假设有一个城市与两个不同的县重叠,所以有两个不同的值。第二个值是同一个城市,但人口较少,表示该城市与第二个县重叠。所以变量包括城市、人口、学区、学区支出、犯罪率等,我想保留一个城市和一个学区唯一的所有值(因此对城市的观察可能会重复),但我不想在表示县重叠时对同一个城市进行两次观察(因为到时候我的人口会减少,这将是错误的陈述,并且会破坏其他一切)。使事情复杂化的是,城市也会逐年重复(因为我想保持我的dput简短,你将看不到这一点) 所以 dat%>%不同(城市、学区

我需要帮助根据几个条件筛选出值

假设有一个城市与两个不同的县重叠,所以有两个不同的值。第二个值是同一个城市,但人口较少,表示该城市与第二个县重叠。所以变量包括城市、人口、学区、学区支出、犯罪率等,我想保留一个城市和一个学区唯一的所有值(因此对城市的观察可能会重复),但我不想在表示县重叠时对同一个城市进行两次观察(因为到时候我的人口会减少,这将是错误的陈述,并且会破坏其他一切)。使事情复杂化的是,城市也会逐年重复(因为我想保持我的dput简短,你将看不到这一点)

所以

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))