#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
аргумент или около того.