簡體   English   中英

R:用ddply進行for循環

[英]R: for-loop with ddply

我是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)) )

現在它似乎給了我正確的結果。 誰可以在這件事上啟發我並告訴我我做錯了什么?

只需使用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))

我知道你沒有要求它,但這是一個base aggregate的解決方案。

# 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))))

您可以使用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)) 
}

我剛剛使用了你的代碼,但是這個循環會在每一輪都覆蓋摘要。 我和你有同樣的問題,所以我只是想讓你知道我最終使用的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM