R - 聚合导致名称(数据)和头部(数据)中的列之间存在差异

R - aggregate results in disparity between names(data) and columns in head(data)

我有一个包含 3 个因子(straingenotyperegion)和 1 个值(volume)的长格式数据集。该数据集称为 individualData。基本上我想做的是计算 strain * genotype * region 的每个组合的体积均值和标准偏差,除了那些没有任何数据的组合(因为基因型标签取决于应变)。似乎我已经能够使用以下命令执行此操作,因为它会产生预期的行数:

  summaryData = aggregate( .~strain:genotype:region, individualData, FUN = function(x) c(mn=mean(x), stdev=sd(x)))

问题是 head(summaryData) 给了我 5 列(volume 被替换为 volume.mnvolume.stdev),正如我预期的那样,但是 names(summaryData)colnames(summaryData) 只给我 4 列——即我原来的列。如何正确引用列?我只想将其折叠成一个我了解如何使用的 data.frame。对 aggregate 函数有更多经验的人知道该怎么做吗?

谢谢!

首先,这里有一些我假设与您的结构相匹配的可重现样本数据

set.seed(15)
individualData <- data.frame(
    volume = runif(120),
    expand.grid(region=1:2, genotype=1:3, strain=1:2)
)

那么你就是运行

summaryData = aggregate( .~strain:genotype:region, individualData, 
    FUN = function(x) c(mn=mean(x), stdev=sd(x)))

如果您查看返回内容的结构,您会得到

str(summaryData)
# 'data.frame':   12 obs. of  4 variables:
#  $ strain  : int  1 2 1 2 1 2 1 2 1 2 ...
#  $ genotype: int  1 1 2 2 3 3 1 1 2 2 ...
#  $ region  : int  1 1 1 1 1 1 2 2 2 2 ...
#  $ volume  : num [1:12, 1:2] 0.526 0.409 0.407 0.445 0.566 ...
#   ..- attr(*, "dimnames")=List of 2
#   .. ..$ : NULL
#   .. ..$ : chr  "mn" "stdev"

所以aggregate实际上已经把一个矩阵塞进了volume列。您可以使用

索引这些值
summaryData$volume[,"mn"]
summaryData$volume[,"stdev"]

或者用

把它变成一个合适的data.frame
summaryData <- do.call(data.frame, summaryData)
summaryData$volume.mn
summaryData$volume.stdev