5

私は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 ループを取り除き、列名 ("gene1") を手動で挿入すると、次のようになります。

summary <- ddply(Data, .(Strain), summarise,
              mean = mean(gene1),
              sd   = sd(gene1),
              se   = sd(gene1) / sqrt(length(gene1)) )

今では正しい結果が得られるようです。誰かがこの問題について私を啓発し、私が間違っていることを教えてもらえますか?

4

3 に答える 3

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))
于 2013-09-10T12:34:52.880 に答える
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)) 
}

私はあなたのコードを使用しましたが、このループはラウンドごとに要約を上書きします。私はあなたと同じ問題を抱えていたので、最終的に使用した解決策をお知らせしたかっただけです.

于 2016-07-11T14:39:12.070 に答える