[英]R dplyr group_by summarise keep last non missing
考虑以下数据集,其中id
唯一地标识一个人,并且name
在id
内仅在次要拼写问题的范围内变化。 我想使用dplyr
聚合到id
级别:
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)
产生name和id,但显然是“错误”的总和。
我想在每个组中保留名称的最后一个非缺失observatoin。 我基本上缺少一个dplyr
版本的Statas lastnm()
函数:
df %>% group_by(id) %>% summarise(sum = sum(var), Name = lastnm(name))
id sum Name
1 1 6 michael
2 2 15 John
是否有“保持最后一次不丢失”的选项?
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
我在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.