包含NA作为ddply的可能子集因子

时间:2013-05-29 19:12:46

标签: r plyr

我希望能够通过所有可能的分类变量组合对我的数据进行测试,包括仅通过一个而不是其他变量进行子集化的可能性。例如,请采用以下数据:

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>

是否可以强制执行以返回此结果?

1 个答案:

答案 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)))