感谢所有为您回应和解答。 我可以看到我已经无意离开了,可以帮助你理解我的问题更好一些重要的细节。 我试图保持它的简单和通用,但实际上并没有帮助。 这里有一个更新版本的更多信息。
我有一个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()来代替,我鬼使神差得来港:
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.tables,不data.frames做。
另一个是更近,但使用AVE()也是繁琐的指定,例如,第1-12列,15-17,和26作为对象的列,和神秘, sd()
产生那些NA的。 好像应该是这样做的简单方法。 几乎让我想为Excel。 :-)