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

R ddply必须使用拆分变量的所有可能组合,还是仅观察?,r,plyr,cardinality,R,Plyr,Cardinality,我有一个名为θ的数据框,包含大约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 le

我有一个名为θ的数据框,包含大约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_cnd
pct_cnd
中的一个可能值匹配,而
model
的其他四个可能值与
rho_cnd
pct_cnd
中的六个可能值对匹配

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

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

对于更好的代码和/或更高的效率有什么建议吗?谢谢

我同意以下评论,即
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)

\newCond我很困惑。为什么
ddply(thetas,((model,rho_cnd,pct_cnd),…)
不起作用?@joran你是对的——我假设,就像
expand.grid()
,使用你建议的方法将导致
ddply
将我的三列条件指示器的所有可能组合配对在一起,而不是只使用实际/观察到的配对。我刚刚测试了一下,你是对的,这是可行的;粘贴是矢量化的(类似于
do.call(粘贴,theta[,…])
应该做的),这对我来说不起作用:(1)
test它与一个列表一起工作,比如data.frame,
do.call(粘贴,c(as.data.frame(test),sep=“”)
啊,太好了!谢谢你的提示:)@rbatt是的,你是joran,这是正确的。谢谢你指出这一点!
#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)
sums <- aggregate(thetas2[,"estError"], by=thetas2[,"newCond"], colSums)