【问题标题】:Excluding rather than including gather variable using tidyeval tidyr [duplicate]使用 tidyeval tidyr 排除而不是包含收集变量 [重复]
【发布时间】:2018-01-26 10:06:24
【问题描述】:

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

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")

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

注意:这是tidyr 0.7.0

【问题讨论】:

  • 你想要一个使用列名作为字符串的函数吗?如果是这样,您可能会发现 -one_of(cols_to_compare) 很有用。
  • 您想将列传递为my_gather(Ozone) 而不是my_gather(-Ozone)?我认为后者相当简单,第一个会稍微复杂一些。
  • aosmith 说得对,one_of() 是这里的解决方案。
  • 另外你不应该以这种方式使用enquo()(它甚至不应该在那种情况下工作,我认为这是一个错误)。 enquo() 用于捕获用户提供的参数并将捕获的表达式包装在 quosure 中。这里不需要捕获,使用 quosure 也无济于事。

标签: r tidyr tidyverse tidyeval


【解决方案1】:

由于gather()select() 具有相同的语义,因此此问题与Remove columns the tidyeval way 重复。

您可以使用-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)

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 2019-10-25
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2019-07-15
    • 2020-10-16
    相关资源
    最近更新 更多