是否有一种 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
调用的结果列表
您可以将 combn
与 lapply
和 do.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/