【发布时间】:2020-12-03 12:42:44
【问题描述】:
我正在尝试更深入地理解将点(“.”)与dplyr 一起使用以及将.data 代词与dplyr 一起使用。我写这篇文章的代码是这样的:
cat_table <- tibble(
variable = vector("character"),
category = vector("numeric"),
n = vector("numeric")
)
for(i in c("cyl", "vs", "am")) {
cat_stats <- mtcars %>%
count(.data[[i]]) %>%
mutate(variable = names(.)[1]) %>%
rename(category = 1)
cat_table <- bind_rows(cat_table, cat_stats)
}
# A tibble: 7 x 3
variable category n
<chr> <dbl> <dbl>
1 cyl 4 11
2 cyl 6 7
3 cyl 8 14
4 vs 0 18
5 vs 1 14
6 am 0 19
7 am 1 13
代码做了我想让它做的事情,并不是这个问题的重点。我只是为上下文提供它。
我正在尝试更深入地了解为什么它会做我想让它做的事情。更具体地说,为什么我不能交替使用. 和.data。我已经阅读了Programming with dplyr 文章,但我想在我看来,. 和.data 都只是表示“我们的结果在管道中的这一点”。但是,我似乎过于简化了我对它们如何工作的心理模型,因为当我在下面的names() 中使用.data 时出现错误:
mtcars %>%
count(.data[["cyl"]]) %>%
mutate(variable = names(.data)[1])
Error: Problem with `mutate()` input `variable`.
x Can't take the `names()` of the `.data` pronoun
ℹ Input `variable` is `names(.data)[1]`.
Run `rlang::last_error()` to see where the error occurred.
当我在count() 内部使用. 时,我得到了一个意想不到的(对我来说)结果:
mtcars %>%
count(.[["cyl"]]) %>%
mutate(variable = names(.)[1])
.[["cyl"]] n variable
1 4 11 .[["cyl"]]
2 6 7 .[["cyl"]]
3 8 14 .[["cyl"]]
我怀疑它与“请注意,.data 不是数据框;它是一个特殊的结构,代词,它允许您直接访问当前变量,使用 .data$x 或间接使用.data[[var]]。不要指望其他函数可以使用它,”来自 Programming with dplyr 文章。这告诉我.data 不是 - 一个数据框 - 但是,我仍然不确定.data 是 是什么以及它与@有何不同987654341@.
我试着像这样弄清楚:
mtcars %>%
count(.data[["cyl"]]) %>%
mutate(variable = list(.data))
但是,结果<S3: rlang_data_pronoun> 对我没有任何帮助我理解的意义。如果有人对此有更好的了解,我将不胜感激。谢谢!
【问题讨论】: