繁体   English   中英

R dplyr group_by总结保持最后的非缺失

[英]R dplyr group_by summarise keep last non missing

考虑以下数据集,其中id唯一地标识一个人,并且nameid内仅在次要拼写问题的范围内变化。 我想使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM