将 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
)处理。
但是,complete
、crossing
和 nesting
使用数据屏蔽,因此将变量转换为名称的方法是通过 .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
中完成
我在使用以列名作为变量的 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
)处理。
但是,complete
、crossing
和 nesting
使用数据屏蔽,因此将变量转换为名称的方法是通过 .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