使用 R 将一行中的值替换为具有相同标识符的另一行中的值



我正在尝试解决R中看似简单的问题,但我无法解决。

我有以下数据:

tmp
town_id city_ id flag
1   10500      111    1           
2   15300     1110    1           
3    9400    11100    1           
4    9400    11101    0           
5    9600    11102    0          
6    9800    11103    0           

有一个重复的town_id,我想在分配标志中的最大值时将其删除。也就是说,我希望有:

town_id city_ id flag
1   10500      111    1           
2   15300     1110    1           
3    9400    11100    1                     
4    9600    11102    0          
5    9800    11103    0           

我尝试使用以下 dplyr 代码,但它为所有内容分配了一个 1:

tmp_2<-tmp %>% group_by(town_id) %>% mutate(flag=max(flag))
tmp_2
town_id city_ id  flag 
1 10500   111          1           
2 15300   1110         1           
3 9400    11100        1           
4 9400    11101        1           
5 9600    11102        1           
6 9800    11103        1           

有人可以告诉我我做错了什么吗?

谢谢。

我想这就是你想要的 - 过滤掉重复项:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
tmp <- structure(list(town_id = c(10500L, 15300L, 9400L, 9400L, 9600L, 9800L), 
city_id = c(111L, 1110L, 11100L, 11101L, 11102L, 11103L), 
flag = c(1L, 1L, 1L, 0L, 0L, 0L)), 
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))
tmp_2 <- tmp %>% group_by(town_id) %>% dplyr::filter(flag==max(flag)) %>% ungroup()
tmp_2
#> # A tibble: 5 x 3
#>   town_id city_id  flag
#>     <int>   <int> <int>
#> 1   10500     111     1
#> 2   15300    1110     1
#> 3    9400   11100     1
#> 4    9600   11102     0
#> 5    9800   11103     0

编辑:如果每个组有多个最大值为flag,并且您只想保留第一个,则可以执行以下操作:

tmp_2 <- tmp %>% group_by(town_id) %>%  
dplyr::filter(flag==max(flag)) %>% 
filter(row_number()==1) %>% ungroup()

创建于 2020-05-22 由 reprex 软件包 (v0.3.0(

它很笨拙,但我认为它应该有效:

tmp = arrange(tmp,-flag) 
tmp = tmp[!(tmp$town_id %>% duplicated),]

相关内容

最新更新