0

我正在尝试编写一个函数来动态地 group_by 字符向量的每个组合。

这就是我设置列表的方式:

stuff <- c("type", "country", "color")
stuff_ListStr <- do.call("c", lapply(seq_along(stuff), function(i) combn(stuff, i, FUN = list)))
stuff_ListChar <- sapply(stuff_ListStr, paste, collapse = ", ")
stuff_ListSym <- lapply(stuff_ListChar, as.symbol)

然后我把它扔进一个循环。

b <- list()
for (each in stuff_ListSym) {
  a <- answers_wfh %>% 
    group_by(!!each) %>% 
    summarize(n=n())
  b <- append(b, a)
}

所以本质上我想复制这个

...     group_by(type),

...     group_by(country),

...     group_by(type, country), 

...以及其余的组合。然后我想将所有摘要放入一个列表(小标题/列表列表)

它完全失败了。这是我的错误信息: Error: Column `type, country` is unknown

不仅如此,b还没有给我想要的东西。这是一个长度为 12 的列表,而我在失败之前只期望 2 。一个按“类型”分组,第二个按“国家”分组。

总的来说,我是 R 新手,但我认为 tidy eval 真的很酷,我想尝试一下。这里有什么提示吗?

4

2 回答 2

3

我认为你有一个标准评估的问题。!!有时不足以取消引用变量并开始dplyr工作。使用!!!andrlang::syms用于多个取消引号

b <- list()
for (each in stuff_ListSym) {
  a <- answers_wfh %>% 
    group_by(!!!rlang::syms(each)) %>% 
    summarize(n=n())
  b <- append(b, a)
}

我认为lapply在你的情况下会比for你想要结束list

由于您使用变量名作为函数的参数,因此您可能会data.tabledplyr. 如果您想要等效的data.table实现:

library(data.table)
setDT(answers_wfh)
lapply(stuff_ListSym, function(g) answers_wfh[,.(n = .N), by = g])

你可以看看我写的这篇关于 SE 与 NSE 主题的dplyrdata.table

于 2020-05-06T07:13:49.117 回答
1

我认为stuff_ListStr足以得到你想要的。你冷使用group_by_at它接受字符向量。

library(dplyr)
library(rlang)

purrr::map(stuff_ListStr, ~answers_wfh %>% group_by_at(.x) %>% summarize(n=n()))

更好的选择是使用count但 count 不接受字符向量,因此使用一些非标准评估。

purrr::map(stuff_ListStr, ~answers_wfh %>% count(!!!syms(.x)))
于 2020-05-06T07:14:52.317 回答