【问题标题】:preserve column-of-tibbles when using grouped summarise with reduce使用带reduce的分组汇总时保留标题列
【发布时间】:2026-01-19 09:30:01
【问题描述】:

问题

在包含 tibbles 的列上使用 tibble %>% group_by() %>% summarise(...=reduce(...)) 时,我希望输出保持为 tibbles 列。我怎样才能最有效地做到这一点?

小例子:

设置

vec1 = rnorm(10)
vec2 = rnorm(10)
vec3 = rnorm(10)
vec4 = rnorm(10)

tib=tibble(grpvar=factor(c('a','a','b','b')))
tib$col2=1
tib$col2[1]=tibble(vec1)
tib$col2[2]=tibble(vec2)
tib$col2[3]=tibble(vec3)
tib$col2[4]=tibble(vec4)

这就是它的样子:

  grpvar col2      
  <fct>  <list>    
1 a      <dbl [10]>
2 a      <dbl [10]>
3 b      <dbl [10]>
4 b      <dbl [10]>

一个非常小的 tibble,其中包含将用于分组的变量,另一列包含包含长度为 10 的向量的 tibble。

问题

summarise 中使用reduce 可以简化输出...

tib %>% group_by(grpvar) %>% summarise(aggr=reduce(col2,`+`))

产量:

   grpvar    aggr
   <fct>    <dbl>
 1 a      -0.0206
...
10 a      -0.101 
...  
20 b       0.520 

在这里,tibble 变得很长......我不希望每个组变量有 10 行,而是只需要一个包含 10 个值的 tibble。

期望的输出:

应该是这个样子

desired_outout<-tibble(grpvar=c('a','b'),aggr=NA)
desired_outout$aggr[1]=tibble(reduce(tib$col2[1:2],`+`))
desired_outout$aggr[2]=tibble(reduce(tib$col2[3:4],`+`))

看起来像:

# A tibble: 2 x 2
  grpvar aggr      
  <chr>  <list>    
1 a      <dbl [10]>
2 b      <dbl [10]

即,它保留了 column-of-tibbles 结构(在内部,我相信它是一个向量列表)

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    list 包裹reduce

    tib %>% group_by(grpvar) %>% summarise(aggr=list(reduce(col2,`+`)))
    

    输出:

    # A tibble: 2 x 2
      grpvar aggr      
      <fct>  <list>    
    1 a      <dbl [10]>
    2 b      <dbl [10]>
    

    【讨论】:

    • 那行得通。我想知道它的效率如何,reduce 是否应该提供一个 simplify=FALSE 左右的参数。
    最近更新 更多