必须ddply使用拆分变量的所有可能组合,或仅观察?

时间:2013-05-03 16:42:43

标签: r plyr cardinality

我有一个名为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 引用它们。我宁愿不使用这个解决方案,但如有必要我会。

{{1}}

有关更好的代码和/或更高效率的建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我同意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)

我希望这会有所帮助。