【发布时间】:2019-02-15 21:11:37
【问题描述】:
我有一个tibble,其中有几个因素作为列名的交互作用(参见下面两个因素的示例)。
ex <- structure(list(`Monday*FALSE` = 42.74, `Monday*TRUE` = 70.68,
`Tuesday*TRUE` = 44.05, `Tuesday*FALSE` = 51.25, `Wednesday*TRUE` = 35.57,
`Wednesday*FALSE` = 59.24, `Thursday*TRUE` = 85.3, `Thursday*FALSE` = 59.91,
`Friday*TRUE` = 47.27, `Friday*FALSE` = 47.44, `Saturday*TRUE` = 62.28,
`Saturday*FALSE` = 98.8, `Sunday*TRUE` = 57.11, `Sunday*FALSE` = 65.99), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -1L))
我想编写一个函数,允许gather 这个tibble,但另外根据输入的因子名称创建一个key 名称。但是,由于paste0 返回一个字符串,因此以下内容无法正常工作。
my_gather <- function(data, ...){
vars <- enquos(...)
data %>%
gather(key = paste0(!!!vars, sep = '*'), value = value, factor_key = TRUE)
}
my_gather(ex, day, cond) %>% head()
# A tibble: 6 x 2
`paste0(day, cond, sep = ".")` value
<fct> <dbl>
1 Monday*FALSE 42.7
2 Monday*TRUE 70.7
3 Tuesday*TRUE 44.0
4 Tuesday*FALSE 51.2
5 Wednesday*TRUE 35.6
6 Wednesday*FALSE 59.2
我尝试将* 替换为. 以创建一个有效的同步名称,然后将paste0 捕获为sym 与!!:
my_gather <- function(data, ...){
vars <- enquos(...)
data %>%
gather(key = !!sym(paste0(!!!vars, sep = '.')), value = value, factor_key = TRUE)
}
但它会导致错误:
!vars 中的错误:参数类型无效
gather 似乎在必要时引用了key 和value 参数,那么有没有办法在key 定义中评估paste0(...)?
【问题讨论】:
-
你能走臭名昭著的
eval(parse(text = paste0(...)))路线吗? -
似乎也不起作用。