3

如果我想排除一些“聚集”的列(Ozone, Day, Month),我可以这样做:

tidyr::gather(airquality, key, value, -Ozone, -Day, -Month)

但是在一个函数中,我不清楚如何做到这一点。这似乎很笨拙,尽管它有效:

my_gather <- function(col_to_compare) {
  gather_cols = dplyr::setdiff(c("Ozone", "Solar.R","Wind","Temp"), col_to_compare)
  tidyr::gather(airquality, key, value, !! rlang::enquo(gather_cols))
}

my_gather("Ozone")

知道如何以更严格的方式排除列吗?

注意:这是tidyr0.7.0

4

1 回答 1

3

由于gather()具有相同的语义select(),这个问题是重复删除列的 tidyeval 方式

您可以使用-one_of(vars)推荐的方法来执行此操作。

gather()或者,您可以构造一个否定符号列表并在调用中拼接这些表达式。以下是如何创建符号并将它们包装在对的调用中-

# This creates a list of symbols
syms <- syms(vars)

# This creates a list of calls:
exprs <- map(syms, function(sym) lang("-", sym))

然后,您可以使用 !!! 拼接调用列表:

df %>% gather(key, value, !!! exprs)
于 2017-08-18T12:35:41.793 回答