【问题标题】:Matrix summation within groups in R dataframesR数据框中组内的矩阵求和
【发布时间】:2018-05-10 23:10:10
【问题描述】:

我有一个包含 groupID 列和矩阵列的数据框。我想计算每组中矩阵的总和(矩阵加法而不是矩阵元素的总和)。

我意识到这解释得很糟糕 - 这是一个例子。

library(tidyverse)
mydf <- data.frame(groupID= sample(c("A", "B", "C", "D"), 20, replace = T)) %>% 
    mutate(mat = lapply(1:20, function(x) matrix(runif(9, 0, 10), nrow=3)))

每个观察值都有一个 groupID(A、B、C 或 D)和一个 3x3 实数矩阵。我想计算每组中所有矩阵的总和 - 即 4 个矩阵,暗淡 3x3。

如果mat 只是一个标量值向量,那么它只是group_by(groupID) %&gt;% summarise(sum(mat)) 的一个简单例子。但由于mat 在技术上是一个矩阵列表,我收到以下错误

Error in summarise_impl(.data, dots) : Evaluation error: invalid 'type' (list) of argument.

虽然我想即使这确实有效,但它会给我所有元素的总和。

我也尝试过Reduce,因为它适用于未分组的矩阵列表:

mydf %>% group_by(groupID) %>% summarise(Reduce('+', mat))
Error in summarise_impl(.data, dots) : `Reduce("+", mat)` must be length 1 (a summary value), not 9

基本上,我的印象是summarise 只想为每个组输出一个值而不是矩阵。

现在,我能想到的唯一解决方案是循环遍历groupID 的每个唯一值,过滤数据框并对剩下的内容求和。但这不是很优雅,因为我的实际数据集有大约 3000 个不同的组。

非常感谢任何聪明的想法。

谢谢,

詹姆斯

【问题讨论】:

    标签: r dataframe matrix


    【解决方案1】:

    通过'groupID'分组后,我们可以在summarise中使用reduce

    library(tidyverse)
    res <- mydf %>% 
             group_by(groupID) %>%
             summarise(mat = list(reduce(mat, `+`))) 
    

    base R 选项是通过 'groupID' 到 split,然后通过循环拆分元素使用 Reduce

    res2 <-  lapply(split(mydf, mydf$groupID), function(x) Reduce('+', x$mat))
    identical(res$mat, unname(res2))
    #[1] TRUE
    

    数据

    set.seed(24)
    mydf <- data.frame(groupID= sample(c("A", "B", "C", "D"), 20, replace = T)) %>% 
                   mutate(mat = lapply(1:20, function(x) matrix(runif(9, 0, 10), nrow=3)))
    

    【讨论】:

    • 嗨,恐怕这些会将每个矩阵中元素的总和作为单个值给出。我正在寻找矩阵加法,以便每个组的输出是一个 3x3 矩阵 - 在向量方面,我想我会在 rowSums() 而不是 sum()
    • @James 你需要split(mydf, mydf$groupID) %&gt;% lapply(., function(x) Reduce('+', x$mat))
    • 是的,就是这个。谢谢!你能把它添加到你的答案中,我会接受吗?
    • @James 我添加了上述评论的 tidyverse 方法
    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2014-07-21
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多