【问题标题】:dplyr: "Error in n(): function should not be called directly"dplyr:“n() 中的错误:不应直接调用函数”
【发布时间】:2014-05-13 03:04:48
【问题描述】:

我正在尝试重现 dplyr 包中的示例之一,但收到此错误消息。我期待看到以每种组合的频率生成的新列 n。我错过了什么?我三次检查包是否已加载。

 library(dplyr)
# summarise peels off a single layer of grouping
by_vs_am <- group_by(mtcars, vs, am)

by_vs <- summarise(by_vs_am, n = n())

n() 中的错误:不应直接调用此函数

【问题讨论】:

    标签: r function plyr dplyr conflicting-libraries


    【解决方案1】:

    对我来说,解决方案是detach() 函数,我利用了该函数的下包

    【讨论】:

    • 你能解释一下“我使用了那个功能下降包”的意思吗?
    • 对不起,我使用了函数 detach() 来下载一个包,我在包 dplyr 和 knitr 之间发生了冲突,然后使用函数来下载包 detach("package:knitr", unload=TRUE)跨度>
    【解决方案2】:

    按照上述博客执行代码时遇到类似问题,然后在 detach("package:plyr", unload=TRUE) 中运行解决方案

    博客:https://www.analyticsvidhya.com/blog/2017/09/comparative-stock-analysis/

    Master_Data_AutoCorrelations<-Master_Data_lags %>%
      gather(key = "lag", value = "lag_value", -c(Stock,Date, Close)) %>%
      mutate(lag = str_sub(lag, start = 5) %>% as.numeric) %>%
      group_by(Stock, lag) %>%
      summarize(
        cor = cor(x = Close, y = lag_value, use = "pairwise.complete.obs"),
        cutoff_upper = 2/(n())^0.5,
        cutoff_lower = -2/(n())^0.5
      )
    

    运行分离后,当上述代码重新运行时,它工作正常,但收到如下警告消息,不确定 plyr 是否被卸载。代码如何正确执行?

    警告信息: 无法卸载“plyr”命名空间: 命名空间‘plyr’由‘reshape2’、‘scales’、‘broom’、‘ggplot2’导入,所以无法卸载

    【讨论】:

      【解决方案3】:

      在另一种情况下,这个错误发生在下面的代码中。

      library(dplyr) # dplyr 0.5.0
      library(lazyeval)
      
      df <- data_frame(group = c(1, 2, 2, 3, 3, 3))
      
      g <- "group"
      
      df %>%
        group_by_(g) %>%
        summarise_(
          n = n(),
          sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
        )
      # Error in n() : This function should not be called directly
      

      可以如下解决。

      df %>%
        group_by_(g) %>%
        summarise_(
          n = "n()",
          sum = interp(~sum(col, na.rm = TRUE), col = as.name(g))
        )
      # A tibble: 3 × 3
      # group     n   sum
      # <dbl> <int> <dbl>
      # 1     1     1     1
      # 2     2     2     4
      # 3     3     3     9
      

      【讨论】:

        【解决方案4】:

        为避免与屏蔽函数混淆,使用“package::function”规范是很明确的,如下例所示:

        delay <- dplyr::summarise(by_tailnum, 
          count = n(), 
          dist = mean(distance, na.rm = TRUE), 
          delay = mean(arr_delay, na.rm = TRUE))
        

        【讨论】:

          【解决方案5】:

          如上一个答案所述,您可能在 plyr 和 dplyr 之间存在冲突。您可以运行此命令来卸载 plyr 包。

          detach("package:plyr", unload=TRUE) 
          

          那么你就可以按预期继续了。

          library(dplyr) 
          ...
          summarise(n = n()) 
          

          【讨论】:

          • 正是...冲突是在汇总或汇总之间。我还意外地在我的一个项目中加载了plyrdplyr 包并意识到了这种冲突。不错的工作伙伴。
          【解决方案6】:

          我假设您在同一会话中加载了 dplyrplyrdplyr 不是 plyrddply 不是 dplyr 包中的函数。

          dplyrplyr 都具有summarise/summarize 的功能。

          查看conflicts() 的结果以查看蒙版对象。

          【讨论】:

          • 解决办法是确保你先加载plyr
          • 正如@User1257894 所说,在包中使用summarize,类似于dplyr::summarize(count = n())
          猜你喜欢
          • 2017-01-11
          • 2019-04-24
          • 2019-12-25
          • 2023-03-06
          • 2015-07-21
          相关资源
          最近更新 更多