【问题标题】:summarize to vector output汇总到向量输出
【发布时间】:2019-11-19 07:05:43
【问题描述】:

假设我有以下(简化的)tibble,其中包含一个组和向量中的值:

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

是否有一个 tidyverse 解决方案可以容纳 summarise 的向量输出?我想避免分裂小标题,因为那样我就会失去这个因素。

【问题讨论】:

  • 试试colSums(do.call(rbind, tb_vec$values))
  • 这对你有用吗? tb_vec %&gt;% group_by(group) %&gt;% tidyr::unnest(values) %&gt;% summarize(vec_sum = colSums(purrr::reduce(values, rbind)))
  • 我想你只需要使用... %&gt;% summarize(vec_sum = list(colSums(purrr::reduce(values, rbind))))
  • 预期输出是什么?这提供了与@NelsonGon 相同的输出,但主要使用unlist()tb_vec%&gt;%group_by(group)%&gt;%summarize(vec_sum = sum(unlist(values)))
  • @AntoniosK。就是这样,谢谢!如果你把它写成答案,我会接受它。

标签: r vector dplyr purrr summarize


【解决方案1】:

您只需在解决方案中的summarise 中添加list(.),以便能够有一个包含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

【讨论】:

  • 我使用...%&gt;%summarize(vec_sum = list(Reduce(`+`, values))) 得到了相同的结果。或者,您可以使用reduce(values, `+`),它比所有选项都慢得惊人。这是作为评论发布的,因为 list() 是真正解决问题的原因。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多