如何在 SE 案例中使用 nesting_
How to use nesting_ in SE case
我正在努力学习如何使用 hadleyverse 进行编程。我已经阅读了 NSE 和 lazyeval 小插曲,但我仍然迷路了......
我正在尝试将 tidyr::complete 帮助页面上给出的示例翻译成 SE 案例。
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))
我的最终目标是能够用我指定的变量做同样的事情:
v1 <- 'group'
v2 <- 'item_id, item_name'
但在我尝试之前,我需要能够直接使用列名来计算它。
首先,即使我知道这不是我想要的,但这至少不会引发错误:
df %>% complete_(list(~group, ~item_id, ~item_name))
我想不通的是如何包含 'nesting_'
我尝试过的事情:
df %>% complete_(~group, nesting_(~item_id, ~item_name))
# Error in nesting_(~item_id, ~item_name) : unused argument (~item_name)
df %>% complete_(~group, nesting_(list(~item_id, ~item_name)))
# Error: Each variable must be named.
# Problem variables: 1, 2
df %>% complete_(~group, nesting_(alist(~item_id, ~item_name)))
# Error: Each variable must be named.
# Problem variables: 1, 2
df %>% complete_(~group, nesting_(list('item_id' = item_id, 'item_name' = item_name)))
# Error in stopifnot(is.list(x)) : object 'item_id' not found
df %>% complete_(~group, nesting_(list('item_id' = df$item_id, 'item_name' = df$item_name)))
# No syntax error, but doesn't expand...
df %>% complete_(~group, nesting_(named_dots(item_id, item_name)))
# Error: Each variable must be a 1d atomic vector or list.
# Problem variables: 'item_id', 'item_name'
df %>% complete_(~group, nesting_(list('item_id' = item_id, 'item_name' = item_name)))
# Error in stopifnot(is.list(x)) : object 'item_id' not found
df %>% complete_(~group, nesting_(list(as.name(item_id), as.name(item_name))))
# Error in as.name(item_id) : object 'item_id' not found
df %>% complete_(~group, nesting_(as.name(item_id), as.name(item_name)))
# Error in nesting_(as.name(item_id), as.name(item_name)) :
# unused argument (as.name(item_name))
感谢您的帮助!!
我让 complete_
和 nesting_
像这样一起工作:
df %>% complete_(list(~group, ~nesting_(list(item_id = item_id, item_name = item_name))))
查看 nesting_
的代码,命名列表似乎来自 tibble::as_data_frame
.
的使用
但是,当您真正开始使用命名变量时,上面的代码并没有多大帮助。事情仍然适用 complete_
好的:
df %>% complete_(list(as.name(v1), ~nesting_(list(item_id = item_id, item_name = item_name))))
您可以通过 setNames
和名称向量为 nesting_
创建命名列表:
v2 <- c("item_id", "item_name")
df %>% complete_(list(as.name(v1), ~nesting_(setNames(list(item_id, item_name), v2))))
但我没有找到处理 nesting_
的名称列表的解决方案。我的失败涉及
df %>% complete_(list(as.name(v1), ~nesting_(setNames(lapply(v2, as.name), v2))))
Error: Each variable must be a 1d atomic vector or list. Problem
variables: 'item_id', 'item_name'
除此之外我没有尝试太多,但这可能会给你一个起点。
感谢@aosmith 的建议,我破解了这个解决方法。
这可能不是 best/correct 方式,但它似乎有效。
从他最后一个有效的陈述开始:
v1 <- 'group'
v2 <- c("item_id", "item_name")
df %>% complete_(list(as.name(v1), ~nesting_(setNames(list(item_id, item_name), v2))))
我尝试了 setNames 调用,看看它做了什么:
setNames(list(df$item_id, df$item_name), v2)
$item_id
[1] 1 2 2
$item_name
[1] "a" "b" "b"
并意识到它只是对 v2 中命名的 df 列进行子集化。所以我尝试通过 select_ 做同样的事情:
df %>% complete_(list(as.name(v1), ~nesting_(select_(., .dots = v2))))
# A tibble: 4 × 5
group item_id item_name value1 value2
<dbl> <dbl> <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
另一种可能是:
v1 <- 'group'
v2 <- c('item_id', 'item_name')
df %>% complete_(c(v1, ~do.call(nesting, lapply(v2, as.name))))
group item_id item_name value1 value2
<dbl> <dbl> <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
这不使用 "SE" nesting_()
,而是利用了要完成的参数可以延迟计算这一事实。我不相信这比 更可取,但它确实删除了 select()
.
的显式使用
我正在努力学习如何使用 hadleyverse 进行编程。我已经阅读了 NSE 和 lazyeval 小插曲,但我仍然迷路了......
我正在尝试将 tidyr::complete 帮助页面上给出的示例翻译成 SE 案例。
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))
我的最终目标是能够用我指定的变量做同样的事情:
v1 <- 'group'
v2 <- 'item_id, item_name'
但在我尝试之前,我需要能够直接使用列名来计算它。 首先,即使我知道这不是我想要的,但这至少不会引发错误:
df %>% complete_(list(~group, ~item_id, ~item_name))
我想不通的是如何包含 'nesting_'
我尝试过的事情:
df %>% complete_(~group, nesting_(~item_id, ~item_name))
# Error in nesting_(~item_id, ~item_name) : unused argument (~item_name)
df %>% complete_(~group, nesting_(list(~item_id, ~item_name)))
# Error: Each variable must be named.
# Problem variables: 1, 2
df %>% complete_(~group, nesting_(alist(~item_id, ~item_name)))
# Error: Each variable must be named.
# Problem variables: 1, 2
df %>% complete_(~group, nesting_(list('item_id' = item_id, 'item_name' = item_name)))
# Error in stopifnot(is.list(x)) : object 'item_id' not found
df %>% complete_(~group, nesting_(list('item_id' = df$item_id, 'item_name' = df$item_name)))
# No syntax error, but doesn't expand...
df %>% complete_(~group, nesting_(named_dots(item_id, item_name)))
# Error: Each variable must be a 1d atomic vector or list.
# Problem variables: 'item_id', 'item_name'
df %>% complete_(~group, nesting_(list('item_id' = item_id, 'item_name' = item_name)))
# Error in stopifnot(is.list(x)) : object 'item_id' not found
df %>% complete_(~group, nesting_(list(as.name(item_id), as.name(item_name))))
# Error in as.name(item_id) : object 'item_id' not found
df %>% complete_(~group, nesting_(as.name(item_id), as.name(item_name)))
# Error in nesting_(as.name(item_id), as.name(item_name)) :
# unused argument (as.name(item_name))
感谢您的帮助!!
我让 complete_
和 nesting_
像这样一起工作:
df %>% complete_(list(~group, ~nesting_(list(item_id = item_id, item_name = item_name))))
查看 nesting_
的代码,命名列表似乎来自 tibble::as_data_frame
.
但是,当您真正开始使用命名变量时,上面的代码并没有多大帮助。事情仍然适用 complete_
好的:
df %>% complete_(list(as.name(v1), ~nesting_(list(item_id = item_id, item_name = item_name))))
您可以通过 setNames
和名称向量为 nesting_
创建命名列表:
v2 <- c("item_id", "item_name")
df %>% complete_(list(as.name(v1), ~nesting_(setNames(list(item_id, item_name), v2))))
但我没有找到处理 nesting_
的名称列表的解决方案。我的失败涉及
df %>% complete_(list(as.name(v1), ~nesting_(setNames(lapply(v2, as.name), v2))))
Error: Each variable must be a 1d atomic vector or list. Problem variables: 'item_id', 'item_name'
除此之外我没有尝试太多,但这可能会给你一个起点。
感谢@aosmith 的建议,我破解了这个解决方法。
这可能不是 best/correct 方式,但它似乎有效。
从他最后一个有效的陈述开始:
v1 <- 'group'
v2 <- c("item_id", "item_name")
df %>% complete_(list(as.name(v1), ~nesting_(setNames(list(item_id, item_name), v2))))
我尝试了 setNames 调用,看看它做了什么:
setNames(list(df$item_id, df$item_name), v2)
$item_id
[1] 1 2 2
$item_name
[1] "a" "b" "b"
并意识到它只是对 v2 中命名的 df 列进行子集化。所以我尝试通过 select_ 做同样的事情:
df %>% complete_(list(as.name(v1), ~nesting_(select_(., .dots = v2))))
# A tibble: 4 × 5
group item_id item_name value1 value2
<dbl> <dbl> <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
另一种可能是:
v1 <- 'group'
v2 <- c('item_id', 'item_name')
df %>% complete_(c(v1, ~do.call(nesting, lapply(v2, as.name))))
group item_id item_name value1 value2
<dbl> <dbl> <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
这不使用 "SE" nesting_()
,而是利用了要完成的参数可以延迟计算这一事实。我不相信这比 select()
.