将 tidyr complete() 与变量中指定的列名一起使用

Using tidyr complete() with column names specified in variables

我在使用以列名作为变量的 tidyr::complete() 函数时遇到问题。

内置示例按预期工作:

df <- data_frame(
 group = c(1:2, 1),
 item_id = c(1:2, 2),
 item_name = c("a", "b", "b"),
 value1 = 1:3,
 value2 = 4:6
)

df %>% complete(group, nesting(item_id, item_name)) 

但是,当我尝试以字符串形式提供列名时,它会产生错误。

gr="group"
id="item_id"
name="item_name"
df %>% complete_(gr, nesting_(id, name),fill = list(NA))

我认为这是一个错误,complete_ 无法与 data.frames 一起使用,或者像 complete 那样列出列可以,但这里有一个使用 unite_ 和 [= 的解决方法14=] 模拟 nesting:

df %>% unite_('id_name', c(id, name)) %>% 
    complete_(c(gr, 'id_name')) %>% 
    separate(id_name, c(id, name))

## # A tibble: 4 × 5
##   group item_id item_name value1 value2
## * <dbl>   <chr>     <chr>  <int>  <int>
## 1     1       1         a      1      4
## 2     1       2         b      3      6
## 3     2       1         a     NA     NA
## 4     2       2         b      2      5

既然 tidyr 采用了 tidy evaluation,下划线变体(即 complete_)已被弃用,因为它们的行为可以由标准变体(complete)处理。

但是,completecrossingnesting 使用数据屏蔽,因此将变量转换为名称的方法是通过 .data[[var]] 代词(根据 the docs),所以你的情况变成:

suppressPackageStartupMessages(
  library(tidyr)
)

df <- data.frame(
  group = c(1:2, 1),
  item_id = c(1:2, 2),
  item_name = c("a", "b", "b"),
  value1 = 1:3,
  value2 = 4:6
)

gr <- "group"
id <- "item_id"
name <- "item_name"

df %>% complete(
  .data[[gr]],
  nesting(.data[[id]],
          .data[[name]])
)
#> # A tibble: 4 x 5
#>   group item_id item_name value1 value2
#>   <dbl>   <dbl> <fct>      <int>  <int>
#> 1     1       1 a              1      4
#> 2     1       2 b              3      6
#> 3     2       1 a             NA     NA
#> 4     2       2 b              2      5

reprex package (v0.3.0)

于 2020 年 2 月 28 日创建

不是很优雅,但它完成了工作。

更简单一点,df %>% complete(!!!syms(gr), nesting(!!!syms(id), !!!syms(name))) 现在可以在 tidyr 1.0.2

中完成