【发布时间】:2018-01-26 10:06:24
【问题描述】:
如果我想排除一些“聚集”的列(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")
知道如何以更严格的方式排除列吗?
注意:这是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