请考虑以下数据集,其中id
唯一地标识一个人,而name
在id
内的变化仅在于较小的拼写问题。我想使用id
聚合到dplyr
级别:
df= data.frame(id=c(1,1,1,2,2,2),name=c('michael c.','mike', 'michael','','John',NA),var=1:6)
使用group_by(id)
会得出正确的计算结果,但是我丢失了name列:
df %>% group_by(id) %>% summarise(newvar=sum(var)) %>%ungroup()
A tibble: 2 x 2
id newvar
<dbl> <int>
1 1 6
2 2 15
使用group_by(id,name)
会同时产生名称和ID,但显然会出现“错误”的总和。
我想在每个组中保留该名称的最后一个不遗余力的观察。我基本上没有Statas dplyr
函数的lastnm()
版本:
df %>% group_by(id) %>% summarise(sum = sum(var), Name = lastnm(name))
id sum Name
1 1 6 michael
2 2 15 John
是否存在“保持最后一个不丢失”选项?
答案 0 :(得分:3)
1)像这样使用mutate
:
df %>%
group_by(id) %>%
mutate(sum = sum(var)) %>%
ungroup
给予:
# A tibble: 6 x 4
id name var sum
<dbl> <fct> <int> <int>
1 1 michael c. 1 6
2 1 mike 2 6
3 1 michael 3 6
4 2 john 4 15
5 2 john 5 15
6 2 john 6 15
2)另一种可能性是:
df %>%
group_by(id) %>%
summarize(name = name %>% unique %>% toString, sum = sum(var)) %>%
ungroup
给予:
# A tibble: 2 x 3
id name sum
<dbl> <chr> <int>
1 1 michael c., mike, michael 6
2 2 john 15
3)另一个变体是仅报告每个组中的名字:
df %>%
group_by(id) %>%
summarize(name = first(name), sum = sum(var)) %>%
ungroup
给予:
# A tibble: 2 x 3
id name sum
<dbl> <fct> <int>
1 1 michael c. 6
2 2 john 15
答案 1 :(得分:0)
我在dplyrs github线程上发布了功能请求,并且响应实际上是最好的答案。为了完整起见,我在此处重新发布:
df %>%
group_by(id) %>%
summarise(sum=sum(var), Name=last(name[!is.na(name)]))
#> # A tibble: 2 x 3
#> id sum Name
#> <dbl> <int> <chr>
#> 1 1 6 michael
#> 2 2 15 John