r - plyr 嵌套组?

标签 r plyr

是否有一种 Eloquent 方法来使用 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))

如果我想在 classifier2 和 classifier3="any"时获得输出,我会再次从 ddply 调用中删除并且只包含 classifier1:

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

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

最佳答案

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

您可以将 combnlapplydo.call('c',...) 结合使用来创建一个列表1,2, ...,n 个变量的所有组合

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)})
   }))

关于r - plyr 嵌套组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15606293/

相关文章:

R:将过滤条件列表传递到数据框中

json - 如何读取嵌套的 JSON 结构?

R: dplyr 中的 plyr::rbind.fill 有没有好的替代品?

r - 有没有办法一次重新编码多个变量?

r - 如何只选择不被打断的号码?

r - 减去多列忽略 NA

r - 使用 lapply 匹配列表元素和数据帧值(查找表)

r - 连接两个数据表以按日期范围覆盖值

r - 将 plyr::mapvalues 与 dplyr 一起使用

r - ddply 返回太多结果