我有一个长格式数据集,包含 3 个因子( strain
、 genotype
、 region
)和 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.mn
和 volume.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"
so aggregate
实际上已将一个矩阵填充到 volume
列中。您可以使用以下方式对这些值进行索引
summaryData$volume[,"mn"]
summaryData$volume[,"stdev"]
或者将其转换为正确的 data.frame
summaryData <- do.call(data.frame, summaryData)
summaryData$volume.mn
summaryData$volume.stdev
关于R - 名称(数据)和头(数据)中的列之间的差异的聚合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28330833/