2

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

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>

可以强制 ddply 返回此结果吗?

4

1 回答 1

2

由于这些是重叠的类别,我认为您不能使用任何单一的拆分-应用-组合策略来获得该结果。因此,只需分别获取结果和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)))
于 2013-05-29T19:36:53.810 回答