使用colnames作为变量的tidyr complete()

时间:2016-11-13 18:46:41

标签: r tidyr complete

我无法使用列名作为变量运行来制作令人敬畏的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))

...但是不会抛出错误但不起作用

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

我认为complete_无法使用complete无法处理数据。框架或unite_等列表列的错误,但这是一个使用separatenesting的解决方法模拟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

.menu-item-has-children

答案 1 :(得分:1)

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

答案 2 :(得分:0)

现在tidyr已进行了整洁的评估,下划线变体(即complete_)已被弃用,因为其行为可以由标准变体(complete)处理。 >

但是,completecrossingnesting使用数据屏蔽,因此将变量转换为名称的方式是通过.data[[var]]代词(每个{{3} }),因此您的情况变为:

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

the docs(v0.3.0)于2020-02-28创建

不太优雅,但是可以完成工作。