【发布时间】:2019-02-15 00:17:47
【问题描述】:
# Code chunk 1
library(tidyverse)
df <- tibble(a = c(NA, 1, 2), b = c(5, 5, 5))
请创建上面的数据框。如果您随后运行此代码块 2
# Code chunk 2
df %>%
mutate(
c = abs(lag(a, 1) - a),
d = sum(.$c, na.rm = TRUE) / (length(.$c) - 1)
)
您收到此错误“未知或未初始化的列:'c'。”。然而,我可以运行相同的代码,以不同的方式排列,得到我想要的(没有错误,正确的输出)。
# Code chunk 3
df %>%
mutate(c = abs(lag(a, 1) - a)) %>%
mutate(d = sum(.$c, na.rm = TRUE) / (length(.$c) - 1))
为什么第二个代码块不起作用?当一个简单的mutate(x, y, z) 更整洁时,我不想将一系列mutate(x) %>% mutate(y) %>% mutate(z) %>% etc. 串在一起。
【问题讨论】:
-
在您的代码块 2 中,点指的是输入到整个 mutate 中的数据集,并且该数据集还没有 c 列。
-
@Nicolas2 如果我的
code chunk 2没有“还没有c列”,那么下面的SmitM 代码是如何工作的,它也引用了c?如果c列还不“存在”。有什么区别? -
因为 SmitM 不使用点表示法。在管道中,点包含上一步的结果。这也是您的第三个块起作用的原因:点指的是添加了 c 列的第一个 mutate 结果。