R - rlang - 使用延迟评估
R - rlang - Working with delayed evaluation
正在尝试解决以下用例:
我有一个完整的数据集 (mydf
),我想根据另一组变量组合 (mysplits
) 的条目使用不同的变量集 dplyr::group_by
。问题是,我的 mysplits
data.frame 包含变量名称作为字符。
有一个 dplyr::group_by_
选项,但我希望使用类似于 rlang
功能或类似功能的工具来实现。
mydf <-
data.frame(
var1 = c('x', 'x', 'y', 'y'),
var2 = c('y', 'z', 'x', 'z'),
var3 = c('a', 'b', 'a', 'b'),
outcome = runif(4),
stringsAsFactors = F
)
mysplits <-
data.frame(
g1 = c('var1', 'var2'),
g2 = c('var2', 'var3'),
stringsAsFactors = F
)
我正在寻找类似的东西:
dlply(
.data = mysplits, .variables = (g1, g2),
function(thissplit){
group_by(mydf, f(thissplit$g1), f(thissplit$g2)) %>% summarise(mean(outcome))
}
)
其中 f()
是我的拼图缺失的部分。
首先,确保您的 data.frame 个名称具有字符值而不是因子水平
mysplits <-
data.frame(
g1 = c('var1', 'var2'),
g2 = c('var2', 'var3'),
stringsAsFactors=FALSE
)
然后您可以使用 group_by_at
和字符串来选择列名。例如
group_by_at(mydf, c("var1", "var2")) %>% summarise(mean(outcome))
你可以用不同的方式遍历值映射,但是你可以使用其他 tidyverse 函数而不是 plyr 函数
map2(mysplits$g1, mysplits$g2, ~group_by_at(mydf, c(.x, .y)) %>% summarise(mean(outcome)))
如果你坚持使用 group_by
和 rlang 的东西,你可以用 rlang::sym()
将字符转换为符号,然后用 !!
取消引用那些像
group_by(mydf, !!rlang::sym(thissplit$g1), !!rlang::sym(thissplit$g2)) %>% summarise(mean(outcome))
正在尝试解决以下用例:
我有一个完整的数据集 (mydf
),我想根据另一组变量组合 (mysplits
) 的条目使用不同的变量集 dplyr::group_by
。问题是,我的 mysplits
data.frame 包含变量名称作为字符。
有一个 dplyr::group_by_
选项,但我希望使用类似于 rlang
功能或类似功能的工具来实现。
mydf <-
data.frame(
var1 = c('x', 'x', 'y', 'y'),
var2 = c('y', 'z', 'x', 'z'),
var3 = c('a', 'b', 'a', 'b'),
outcome = runif(4),
stringsAsFactors = F
)
mysplits <-
data.frame(
g1 = c('var1', 'var2'),
g2 = c('var2', 'var3'),
stringsAsFactors = F
)
我正在寻找类似的东西:
dlply(
.data = mysplits, .variables = (g1, g2),
function(thissplit){
group_by(mydf, f(thissplit$g1), f(thissplit$g2)) %>% summarise(mean(outcome))
}
)
其中 f()
是我的拼图缺失的部分。
首先,确保您的 data.frame 个名称具有字符值而不是因子水平
mysplits <-
data.frame(
g1 = c('var1', 'var2'),
g2 = c('var2', 'var3'),
stringsAsFactors=FALSE
)
然后您可以使用 group_by_at
和字符串来选择列名。例如
group_by_at(mydf, c("var1", "var2")) %>% summarise(mean(outcome))
你可以用不同的方式遍历值映射,但是你可以使用其他 tidyverse 函数而不是 plyr 函数
map2(mysplits$g1, mysplits$g2, ~group_by_at(mydf, c(.x, .y)) %>% summarise(mean(outcome)))
如果你坚持使用 group_by
和 rlang 的东西,你可以用 rlang::sym()
将字符转换为符号,然后用 !!
取消引用那些像
group_by(mydf, !!rlang::sym(thissplit$g1), !!rlang::sym(thissplit$g2)) %>% summarise(mean(outcome))