感谢大家的回复和回答。我可以看到我无意中遗漏了一些可能有助于您更好地理解我的问题的重要细节。我试图保持简单和通用,但这实际上并没有帮助。这是包含更多信息的更新版本。
我有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.tables,而不是 data.frames 有关。
另一个更接近,但是使用 ave() 也很乏味,例如,指定第 1-12、15-17 和 26 列作为主题列,并且神秘地sd()
产生了这些 NA。似乎应该有一个简单的方法来做到这一点。几乎让我希望Excel。:-)