【问题标题】:R - Averaging large matrixR - 平均大矩阵
【发布时间】:2018-07-22 18:33:31
【问题描述】:

我目前有一个大型矩阵,有 72 行919 列

amatrix <- matrix(rexp(919, rate=.1), ncol=919, nrow=72)

由于这是一个包含technical replicates 的数据框,我必须首先对技术复制的值进行平均,然后再进行进一步分析。技术复制是连续的(行),每组 3 个。

  • 有没有一种方法可以一次平均 3 行,从而生成一个具有 24 行919 列 的新矩阵?

到目前为止,我一直在手动完成这部分并将数据导入回 R。在 R 中必须有一种方法可以做到这一点,但我找不到类似的答案。

【问题讨论】:

  • 这很令人困惑,因为它不能既是矩阵又是数据框。请说明为什么将其称为数据框,因为这实际上对计算有一些影响。
  • rowsum 对于这类事情来说是一个时髦(且快速)的小函数...rowsum(amatrix, rep(1:(72/3), each=3))/3

标签: r matrix


【解决方案1】:

我认为关键是要知道如何使用 R 代码来描述模式,例如

rep(1:(nrow(amatrix)/3), each=3)

那么这只是组级聚合的问题。您可以使用任何基础、dplyrdata.table 或其他聚合方法来执行此操作。

让我们从基础 R 开始。

我更喜欢将其用作data.frame,但您也可以将其保留为矩阵,只需使用[] 索引而不是$ 来创建新向量:

amatrix                      <- as.data.frame(matrix(rexp(919, rate=.1), ncol=919, nrow=72))
amatrix$technical_rep_number <- rep(1:(nrow(amatrix)/3), each=3)

这个向量的创建实际上是完全可选的。你也可以让你的矩阵保持原样,只在聚合函数中指定模式(rep(1:(nrow(amatrix)/3), each=3),在这种情况下)。

从基础 R 我们可以使用aggregate:

new_table <- aggregate(amatrix, by=list(amatrix$technical_rep_number), mean)

nrow(new_table)
24

dplyr 中,我们可以使用group_bysummarize

new_table <- amatrix %>% 
              group_by(technical_rep_number) %>% 
              summarize(mean1 = mean(V1)) # etc

你也可以一次取所有列的方法like this

new_table <- amatrix %>% 
              group_by(technical_rep_number) %>% 
              summarise_each(funs(mean))

请注意,summarise_each() 已被弃用,所以我推荐summarize_all()

new_table <- amatrix %>% 
              group_by(technical_rep_number) %>% 
              summarize_all(funs(mean)) 

【讨论】:

  • 这很快就解决了问题。感谢您不仅快速响应,还感谢您的详细解释,让我知道下次遇到类似问题该怎么办。
  • @AlexCharles 乐于助人,Alex。干杯!哦,顺便说一句,如果您对此感到满意,您可以通过单击绿色复选标记让未来的读者知道这是解决方案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
相关资源
最近更新 更多