回答と回答をありがとうございました。私の問題をよりよく理解するのに役立つかもしれないいくつかの重要な詳細を意図せずに省略したことがわかります. シンプルで一般的なものにしようとしましたが、実際には役に立ちませんでした。詳細情報を含む更新版を次に示します。
によって生成されたモデルdata.frame
から得られた多くの列を持つ があります。各列は、異なる実験条件下で報告された値を表す時系列であり、繰り返しは実行数と時間ステップ数で表されます。たとえば、(これは長くて申し訳ありませんが、データのフレーバーを提供しようとしています):NetLogo
BehaviorSpace
# Start by building a fake data.frame that models some of the characteristics of mine:
df <- data.frame(run = c(rep(1,5), rep(2,5), rep(3,5), rep(4,5), rep(5,5), rep(6,5), rep(7,5), rep(8,5)))
df2 <- expand.grid(step = 1:5, fac.a = c(10,1000), fac.b = c(0.5,2.0))
df <- data.frame(run = df$run, rep = c(rep(1,20), rep(2,20)), step = df2$step, fac.a = df2$fac.a, fac.b = df2$fac.b)
log_growth <- function (a, b, x) {(1/(1+a*exp(-b*x))) + rnorm(1,0,0.2)}
set.seed(11)
df$treatment1 <- log_growth(df$fac.a, df$fac.b, df$step)
df$treatment2 <- log_growth(df$fac.a / 2, df$fac.b * 2, df$step)
これにより、以下が df に入れられます。
> df
run rep step fac.a fac.b treatment1 treatment2
1 1 1 1 10 0.5 0.05288201 0.356176584
2 1 1 2 10 0.5 0.12507561 0.600407158
3 1 1 3 10 0.5 0.22081815 0.804671117
4 1 1 4 10 0.5 0.33627099 0.920093934
5 1 1 5 10 0.5 0.46053940 0.971397427
6 2 1 1 1000 0.5 -0.08700866 0.009396323
7 2 1 2 1000 0.5 -0.08594375 0.018552055
8 2 1 3 1000 0.5 -0.08419297 0.042608835
9 2 1 4 1000 0.5 -0.08131981 0.102435481
10 2 1 5 1000 0.5 -0.07661880 0.232875872
11 3 1 1 10 2.0 0.33627099 0.920093934
12 3 1 2 10 2.0 0.75654214 1.002314651
13 3 1 3 10 2.0 0.88715737 1.003958435
14 3 1 4 10 2.0 0.90800192 1.003988593
15 3 1 5 10 2.0 0.91089154 1.003989145
16 4 1 1 1000 2.0 -0.08131981 0.102435481
17 4 1 2 1000 2.0 -0.03688314 0.860350536
18 4 1 3 1000 2.0 0.19880473 1.000926458
19 4 1 4 1000 2.0 0.66014952 1.003932891
20 4 1 5 1000 2.0 0.86791705 1.003988125
21 5 2 1 10 0.5 0.05288201 0.356176584
22 5 2 2 10 0.5 0.12507561 0.600407158
23 5 2 3 10 0.5 0.22081815 0.804671117
24 5 2 4 10 0.5 0.33627099 0.920093934
25 5 2 5 10 0.5 0.46053940 0.971397427
26 6 2 1 1000 0.5 -0.08700866 0.009396323
27 6 2 2 1000 0.5 -0.08594375 0.018552055
28 6 2 3 1000 0.5 -0.08419297 0.042608835
29 6 2 4 1000 0.5 -0.08131981 0.102435481
30 6 2 5 1000 0.5 -0.07661880 0.232875872
31 7 2 1 10 2.0 0.33627099 0.920093934
32 7 2 2 10 2.0 0.75654214 1.002314651
33 7 2 3 10 2.0 0.88715737 1.003958435
34 7 2 4 10 2.0 0.90800192 1.003988593
35 7 2 5 10 2.0 0.91089154 1.003989145
36 8 2 1 1000 2.0 -0.08131981 0.102435481
37 8 2 2 1000 2.0 -0.03688314 0.860350536
38 8 2 3 1000 2.0 0.19880473 1.000926458
39 8 2 4 1000 2.0 0.66014952 1.003932891
40 8 2 5 1000 2.0 0.86791705 1.003988125
したがって、私が以前に行ったことは、使用してデータフレームを分割し、by
すべてのステップ (時系列) および要因の各組み合わせの平均と標準偏差を取得したかったことです。
あなたのすべての回答を見て、私の問題を再考した後、私がやろうとしていることは、の変換プロセスでより適切に処理されると思いますby
。その方法が正確にはわかりません...出力を次のように表示したいのは、次のような要約です。
> df
run fac.a fac.b mean.treatment1 mean.treatment2 sd.treatment1 sd.treatment2
1 1 10 0.5 xxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx
1 1 10 2.0 xxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx
1 1 1000 0.5 xxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx
1 1 1000 2.0 xxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx
これは のための仕事aggregate
ですか? ご理解とご協力をお願いいたします。-- グレン
元の質問:
多くdata.frame
の列があり、それぞれが繰り返しのある特定の実験条件を表しています。
> df <- data.frame(a.1 = runif(5), b.1 = runif(5), a.2 = runif(5), b.2 = runif(5), mean.a = 0, mean.b = 0, mean.1 = 0, mean.2 = 0)
> df
a.1 b.1 a.2 b.2 mean.a mean.b sd.a sd.b
1 0.9209433 0.3501444 0.3893140 0.3264827 0 0 0 0
2 0.4171254 0.4883140 0.8282384 0.1215129 0 0 0 0
3 0.2291582 0.9419946 0.4089008 0.5665242 0 0 0 0
4 0.3807868 0.1889066 0.8271075 0.4022014 0 0 0 0
5 0.5863078 0.4991847 0.4082745 0.5637367 0 0 0 0
各条件と繰り返しの平均と標準偏差を見つけたいです。これまでのところ、最も直接的な方法は次のようです。
for (i in c("a.1", "a.2") {df$mean.a <- df$mean.a + df[[i]]}
df$mean.a <- df$mean.a / 2
しかし、私はたくさんのコラムを持っていて、それらはいたるところにあるので、これは本当に労働集約的で手作業のようです. もう少し良い方法は、次を使用することave()
です。
df$mean.a <- with (df, ave(a.1, a.2))
しかし、代わりに sd() を実行したい場合は、不思議なことに NA を取得します。
df$sd.a <- with (df, ave(a.1, a.2, FUN = sd))
> df
a.1 b.1 a.2 b.2 mean.a mean.b sd.a sd.b
1 0.9209433 0.3501444 0.3893140 0.3264827 0.9209433 0 NA 0
2 0.4171254 0.4883140 0.8282384 0.1215129 0.4171254 0 NA 0
3 0.2291582 0.9419946 0.4089008 0.5665242 0.2291582 0 NA 0
4 0.3807868 0.1889066 0.8271075 0.4022014 0.3807868 0 NA 0
5 0.5863078 0.4991847 0.4082745 0.5637367 0.5863078 0 NA 0
可能であれば外部パッケージを使用したくないのですが、基本的なものが欠けているようです。この質問は似ていましたが、data.frames ではなく、data.tables に関するものでした。
もう 1つはさらに近いものでしたが、ave() を使用すると、たとえば列 1 ~ 12、15 ~ 17、および 26 をサブジェクト列として指定するのも面倒で、不思議なことに、sd()
これらの NA が生成されます。これを行う簡単な方法があるはずです。Excelが欲しくなるくらいです。:-)