我正在尝试解决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),]