我是R和stackoverflow的新手,所以如果问题或格式不理想我很抱歉......
我正在尝试使用ddply从矩阵中获取一些基本统计信息,我想通过使用for -loop使进程更快一些。不幸的是,这并不像我想象的那么容易......
Strain gene1 gene2 gene3 . . .
A 2.6336700 1.42802 0.935742
A 2.0634700 2.31232 1.096320
A 2.5798600 2.75138 0.714647
B 2.6031200 1.31374 1.214920
B 2.8319400 1.30260 1.191770
B 1.9796000 1.74199 1.056490
C 2.4030300 1.20324 1.069800
.
.
.
----------
for (n in c("gene1","gene2","gene3","gene4")) {
summary <- ddply(Data, .(Strain), summarise,
mean = mean(n),
sd = sd(n),
se = sd(n) / sqrt(length(n)) )
}
在结果中,它表示平均值= 6,sd和se都是“NA”......显然不是我想到的。
如果我摆脱for -loop并手动插入列名(“gene1”):
summary <- ddply(Data, .(Strain), summarise,
mean = mean(gene1),
sd = sd(gene1),
se = sd(gene1) / sqrt(length(gene1)) )
现在它似乎给了我正确的结果。有人可以告诉我这个问题并告诉我我做错了什么吗?
答案 0 :(得分:2)
只需使用colwise (mean)
,colwise(sd)
和colwise(length)
即可。无需for loop
library(plyr)
ddply(mtcars,.(cyl), colwise(mean))
cyl mpg disp hp drat wt qsec vs am gear carb
1 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 1.545455
2 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 3.428571
3 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 3.500000
对于你的例子,
ddply(df,.(Strain),colwise(mean))
答案 1 :(得分:2)
我知道你没有要求它,但这是aggregate
中base
的解决方案。
# One line in base.
aggregate(Data[paste0('gene',1:3)],by=Data['Strain'],
function(x) c(mean=mean(x),sd=sd(x),se=sd(x)/sqrt(length(x))))
答案 2 :(得分:0)
你可以使用ddply来完成它,但是你必须首先将命令转换为字符串,然后通过计算字符串来创建变通方法。
all.genes <- c("gene1","gene2","gene3","gene4")
for (i in 1:length(all.genes) {
string_eval <- sprintf("summary <- ddply(Data, .(%s), summarise,
mean = mean(n),
sd = sd(n),
se = sd(n) / sqrt(length(n)))",
all.genes[i])
eval(parse(text = string_eval))
}
我刚刚使用了你的代码,但是这个循环会在每一轮都覆盖摘要。我和你有同样的问题,所以我只是想让你知道我最终使用的解决方案。