суммировать с векторным выходом - PullRequest
5 голосов
/ 09 июля 2019

Допустим, у меня есть следующий (упрощенный) тиббл, содержащий группу и значения в векторах:

set.seed(1)
(tb_vec <- tibble(group = factor(rep(c("A","B"), c(2,3))),
             values = replicate(5, sample(3), simplify = FALSE)))
# A tibble: 5 x 2
  group values   
  <fct> <list>   
1 A     <int [3]>
2 A     <int [3]>
3 B     <int [3]>
4 B     <int [3]>
5 B     <int [3]>

tb_vec[[1,2]]
[1] 1 3 2

Я хотел бы суммировать векторы значений для каждой группы, суммируя их (векторизовать) и попробовав следующее:

tb_vec %>% group_by(group) %>% 
  summarize(vec_sum = colSums(purrr::reduce(values, rbind)))

Ошибка: столбец vec_sum должен иметь длину 1 (суммарное значение), а не 3

Ошибка удивляет меня, потому что тиблы (выходной формат) могут также содержать векторы.

Мой ожидаемый результат будет следующим кратким тибблом:

# A tibble: 2 x 2
  group vec_sum  
  <fct> <list>   
1 A     <dbl [3]>
2 B     <dbl [3]>

Существует ли решение для приведения в соответствие с векторным выводом суммирования? Я хочу не разбивать тибл, потому что тогда я теряю фактор.

1 Ответ

3 голосов
/ 09 июля 2019

Вам просто нужно добавить list(.) в пределах summarise в вашем решении, чтобы иметь возможность иметь столбец с 2 элементами, где каждый элемент представляет собой вектор из 3 значений:

library(tidyverse)

set.seed(1)
(tb_vec <- tibble(group = factor(rep(c("A","B"), c(2,3))),
                  values = replicate(5, sample(3), simplify = FALSE)))

tb_vec %>% 
  group_by(group) %>%                              
  summarize(vec_sum = list(colSums(purrr::reduce(values, rbind)))) -> res

res$vec_sum

# [[1]]
# [1] 2 4 6
# 
# [[2]]
# [1] 6 5 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...