2

是否有一种雄辩的方法可以ddply()用来获得不仅定义的最细粒度组的输出,还可以获得这些子组的组的输出?

换句话说,当其中一个分类器是“任何”或“任一”或“无关紧要”时。在两个分组变量的简单情况下,这可以通过单独调用来完成ddply;但是,当有三个或更多分类器都可以设置为“任何”时,由于必须ddply为“任何”+其他的每个新组合一遍又一遍地运行,这会变得很混乱。

可重现的例子:

require(plyr)

## create a data frame with three classification variables
## and two numeric variables:
df1=data.frame(classifier1 = LETTERS[sample(2,200,replace=T)],
classifier2 = letters[sample(3,200,replace=T)],
classifier3 = rep(c("foo","bar"),100),
VAR1 = runif(200,50,250),
VAR2 = rnorm(200,85,20))

## apply an arbitrary function to subsets of df1; that is, all unique
## combinations of the three classifiers.
dlply(df1, .(classifier1,classifier2,classifier3),
      function(df) lm(VAR1 ~ VAR2, data=df))

$A.a.bar

Call:
lm(formula = VAR1 ~ VAR2, data = df)

Coefficients:
(Intercept)         VAR2  
   230.5555      -0.8591  


$A.a.foo

Call:
lm(formula = VAR1 ~ VAR2, data = df)

Coefficients:
(Intercept)         VAR2  
   128.3078       0.3631  

...

现在,如果我想在不包括任何/所有分类器的情况下为更多组获得相同的输出怎么办。例如,如果我想包含 when classifier1="any",我只会在dlply语句中包含 classifier2 和 classifier3,如下所示:

dlply(df1, .(classifier2,classifier3), function(df) lm(VAR1 ~ VAR2, data=df))

如果我想获得分类器 2 和分类器 3 =“任何”时的输出,我将再次从ddply调用中删除并且只包括分类器 1:

dlply(df1, .(classifier1), function(df) lm(VAR1 ~ VAR2, data=df))

但是,当我的分类器多于三个时,这会变得笨拙,并且每个分类器都可以取出(即=“任何”)——组合的数量大大增加。是否有一种雄辩/快速的方法来获取我的数据的所有“组组”的输出?

4

1 回答 1

4

一种方法是创建一个组合列表,然后用于Map创建每个dlply调用结果的列表

您可以与和combn结合使用来创建 1,2, ...,n 变量的所有组合的列表lapplydo.call('c',...)

xx <- do.call('c',lapply(1:3, function(m) {
           combn(x=names(df1)[1:3],m, simplify = FALSE)}))

然后,您可以在调用中使用它Map(它是mapply(..., SIMPLIFY = FALSE)

results <- Map(f = function(x){dlply(df1,.var=x, .fun = lm, formula = VAR1 ~ VAR2)},xx)

或者你可以将一个函数传递给combn-- 它会做同样的事情

results <-  do.call('c',lapply(1:3, function(m) {
  combn(x=names(df1)[1:3],m, simplify = FALSE, 
      function(vv) {dlply(df1,.var=vv, .fun = lm, formula = VAR1~VAR2)})
   }))
于 2013-03-25T02:15:29.110 回答