R dplyr group_by总结保留最后一个不丢失

时间:2019-03-02 14:45:42

标签: r dplyr

请考虑以下数据集,其中id唯一地标识一个人,而nameid内的变化仅在于较小的拼写问题。我想使用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

是否存在“保持最后一个不丢失”选项?

2 个答案:

答案 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