【问题标题】:dplyr comma (,) syntax appears brokendplyr 逗号 (,) 语法出现损坏
【发布时间】: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) %&gt;% mutate(y) %&gt;% mutate(z) %&gt;% etc. 串在一起。

【问题讨论】:

  • 在您的代码块 2 中,点指的是输入到整个 mutate 中的数据集,并且该数据集还没有 c 列。
  • @Nicolas2 如果我的code chunk 2 没有“还没有c 列”,那么下面的SmitM 代码是如何工作的,它也引用了c?如果c 列还不“存在”。有什么区别?
  • 因为 SmitM 不使用点表示法。在管道中,点包含上一步的结果。这也是您的第三个块起作用的原因:点指的是添加了 c 列的第一个 mutate 结果。

标签: r dplyr


【解决方案1】:

我们也可以

df %>%
  mutate(c = abs(lag(a) - a),
          d = sum(c, na.rm = TRUE)/(n() - 1))

【讨论】:

  • n() 也是length() 的包装器(这是正确的词)吗?你能扩展一下吗?
  • dplyr 中的 @stackinator n() 给出了行数。它与length 类似,length 给出了该列中的元素数
【解决方案2】:

它工作正常。您需要修改一些代码。

df %>%
  mutate(
    c = abs(lag(a, 1) - a),
    d = sum(c, na.rm = TRUE) / (length(c) - 1)
  )

.$c 更改为 c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2017-05-07
    • 2015-12-26
    相关资源
    最近更新 更多