gpt4 book ai didi

r - plyr 嵌套组?

转载 作者:行者123 更新时间:2023-12-05 03:15:28 26 4
gpt4 key购买 nike

是否有一种 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com