-->

必须ddply使用分裂变量(多个),或仅观察到的所有可能的组合?(Must ddply use al

2019-10-18 02:17发布

我有一个叫做数据帧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

有什么建议给更好的代码和/或更高的效率? 谢谢!

Answer 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)

我承认,上面的代码可能会为你慢慢跑,所以我不知道这是你想要的。 但是,从那里,你应该能够与.variables = newCond ddply使用()。

此外,因为你只返回的数据的每个子集单号,你可以只使用总量,如果你想要的。

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

我希望这有帮助。



文章来源: Must ddply use all possible combinations of the splitting variable(s), or only observed?