сохранить количество столбцов при использовании сгруппированного суммирования с уменьшением

#r #dplyr #purrr

#r #dplyr #муррр

Вопрос:

Вопрос

При использовании tibble %>% group_by() %>% summarise(...=reduce(...)) в столбце, содержащем tibbles, я бы хотел, чтобы результат оставался столбцом 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 с переменной, которая будет использоваться для группировки, и другой столбец, содержащий tibbles, которые содержат векторы длиной 10.

Проблема

Использование reduce внутри summarise упрощает вывод…

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

дает:

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

Здесь таблица становится очень длинной … Я не хочу 10 строк на групповую переменную, а вместо этого только одну строку, содержащую 10 значений.

Желаемый результат:

Вот как это должно выглядеть

 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]
 

т. Е. Он сохраняет структуру столбцов с числами (которая, как я полагаю, внутренне представляет собой список векторов)

Ответ №1:

Оберните reduce с помощью list :

 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]>
 

Комментарии:

1. Это работает. Интересно, насколько это эффективно и reduce следует ли предлагать simplify=FALSE аргумент или около того.