我希望能够通过所有可能的分类变量组合对我的数据进行测试,包括仅通过一个而不是其他变量进行子集化的可能性。例如,请采用以下数据:
dbh <- runif(100,5,40)
err <- runif(100,0,4)
height <- dbh^.8 + err
elevation <- factor(rep(c("L","M","H"),100)[1:100], levels=c("L","M","H",NA))
aspect <- factor(rep(c("E","W"),50), levels=c("E","W",NA))
dat <- data.frame(dbh, height, aspect, elevation)
为了得到方面和高程的所有组合的平均值dbh,我试过
library(plyr)
result <- ddply( dat, c("elevation","aspect"), summarise, mean(dbh))
但是,这只取以下子集的平均值:
elevation aspect ..1
1 L E 26.07509
2 L W 23.78510
3 M E 26.72313
4 M W 20.88566
5 H E 19.63125
6 H W 18.60170
我希望它采取以下方法:
factors <- data.frame(elevation = rep(c("H","M","L",NA),3),
aspect = c(rep("E",4),rep("W",4), rep(NA,4)))
elevation aspect
1 H E
2 M E
3 L E
4 <NA> E
5 H W
6 M W
7 L W
8 <NA> W
9 H <NA>
10 M <NA>
11 L <NA>
12 <NA> <NA>
是否可以强制执行以返回此结果?
答案 0 :(得分:2)
由于这些是重叠的类别,我认为您不能使用任何单一的split-apply-combine策略来获得该结果。因此,只需单独获取结果并rbind
它们(或更确切地说rbind.fill
它们,以补偿不同的列):
rbind.fill(ddply( dat, c("elevation","aspect"), summarise, mean(dbh)),
ddply( dat, "elevation", summarise, mean(dbh)),
ddply( dat, "aspect", summarise, mean(dbh)),
data.frame('..1' = mean(dat$dbh)))