1

我有一个名为thetas包含大约 270 万个观测值的数据框。

> str(thetas)
'data.frame':   2700000 obs. of  8 variables:
 $ rho_cnd   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ pct_cnd   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ sx        : num  1 2 3 4 5 6 7 8 9 10 ...
 $ model     : Factor w/ 7 levels "dN.mN","dN.mL",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ estTheta  : num  -1.58 -1.716 0.504 -2.296 0.98 ...
 $ trueTheta : num  0.0962 -3.3913 3.6006 -0.1971 2.1906 ...
 $ estError  : num  -1.68 1.68 -3.1 -2.1 -1.21 ...
 $ trueAberSx: num  0 0 0 0 0 0 0 0 0 0 ...

我想使用ddply或一些类似的函数来求和估计误差(estError我的数据框中的列),但总和在我的模拟的每个条件内。问题是,我没有一种简单的方法来组合来自该数据框其他列的值来唯一标识所有这些条件。更具体地说:该列model包含 7 个可能的值。这些可能值中的三个仅与 和 中的一个可能值匹配rho_cndpct_cnd而 的其他四个可能值与和model中的 6 个可能的值对匹配。rho_cndpct_cnd

我知道,显而易见的解决方案是返回并创建一个变量来唯一标识我需要在此处标识的所有条件,以便以下代码可以工作:

> sums <- ddply(thetas,.(condition1,condition2,etc.),sum(estError))

但我只是不想回去重新创建这个数据框是如何构建的。现在我有两个数据框,通过两个单独的调用创建,然后对expand.grid它们进行rbind编辑和排序以创建一个列出所有有效条件的数据框,但即使我保留了那几行代码,我也不确定如何引用它们ddply. 我什至宁愿不使用这个解决方案,但如果有必要我会。

> conditions 
   models rhos pcts
1   dN.mN  0.0 0.00
2   dN.mL  0.0 0.00
3   dN.mH  0.0 0.00
4   dL.mN  0.1 0.01
12  dL.mN  0.1 0.02
20  dL.mN  0.1 0.10
8   dL.mN  0.2 0.01
16  dL.mN  0.2 0.02
24  dL.mN  0.2 0.10
5   dL.mL  0.1 0.01
13  dL.mL  0.1 0.02
21  dL.mL  0.1 0.10
9   dL.mL  0.2 0.01
17  dL.mL  0.2 0.02
25  dL.mL  0.2 0.10
6   dH.mN  0.1 0.01
14  dH.mN  0.1 0.02
22  dH.mN  0.1 0.10
10  dH.mN  0.2 0.01
18  dH.mN  0.2 0.02
26  dH.mN  0.2 0.10
7   dH.mH  0.1 0.01
15  dH.mH  0.1 0.02
23  dH.mH  0.1 0.10
11  dH.mH  0.2 0.01
19  dH.mH  0.2 0.02
27  dH.mH  0.2 0.10

关于更好的代码和/或更高效率的任何建议?谢谢!

4

1 回答 1

2

我同意ddply(thetas,.(model,rho_cnd,pct_cnd),...)应该有效的评论。如果这些变量的某些组合没有出现, ddply(..., .drop=TRUE) 将确保未观察到的组合不会出现。

但是,如果您想避免 ddply 浏览一些不存在的组合,您可以尝试以下操作:

#newCond <- apply(thetas[,c("model", "rho_cnd", "pct_cnd")], 1, paste, collapse="_")
newCond <- do.call(paste, thetas[,c("model", "rho_cnd", "pct_cnd")], sep="_") #as suggested by baptiste
thetas2 <- cbind(thetas, newCond)

我承认,上面的代码可能对你来说运行缓慢,所以我不确定它是否是你想要的。但是从那里你应该能够使用 ddply() 和 .variables=newCond。

此外,由于您只为每个数据子集返回一个数字,因此如果需要,您可以只使用聚合。

sums <- aggregate(thetas2[,"estError"], by=thetas2[,"newCond"], colSums)

我希望这有帮助。

于 2013-05-04T00:27:39.370 回答