【问题标题】:dplyr error with summarise_ and n() [duplicate]summarise_ 和 n() 的 dplyr 错误 [重复]
【发布时间】:2018-01-20 11:05:34
【问题描述】:

我计划使用循环遍历几百列并计算中位数并针对一组变量进行计数。

代码:

grp_var <- "Species" 
voi <- "Sepal.Length"
dmp <- iris%>%
      select_(grp_var,voi)%>% 
      group_by_(grp_var)%>%
      summarise_(Median_Value = median(voi),Count = n())

错误:

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

我在使用 summarise_ 时遇到了这个错误,而在我使用 summarise 时根本没有遇到任何问题。

我知道对 n() 的函数调用只是错误消息,但是在 dplyr 函数中调用它应该返回行数。 我只是对此感到愚蠢还是这是一个错误?

编辑:我对 summarise 函数没有任何冲突,plyr 没有加载。

【问题讨论】:

  • 看起来你已经加载了 plyr 包。先试试detach("package:plyr")
  • 我检查了冲突,没有任何冲突。我也没有加载 plyr 包。
  • 问题是在summarise_ 内部混合了标准和非标准评估。 keiku 在question that keeps getting linked 的回答中涵盖了该解决方案。
  • 由于 dplyr 现在的版本 >= 0.7,tidyeval 现在是新概念。所有*_ 函数现已弃用。当前dplyr的链接答案已过时@

标签: r dplyr


【解决方案1】:

首先,如 cmets 中所述,您混合了标准评估和非标准评估。找不到n(),因为您不能像在*_ 函数中那样使用它。在dplyr0.7.0 之前,您将在summarise_ 中使用~n()

然而,tidyverse 世界的情况发生了变化。

0.7.0 版本开始,dplyr 现在使用一个新的系统来使用 dplyr 进行编程,称为 tidy 评估,或简称为 tidy eval。所有带有*_ 的函数现在都已弃用,不应在新代码中使用,除非您想保持对旧dplyr 版本的依赖。我建议现在使用 tidy eval。我这里就不解释了,大家可以看Programming vignette

例如,现在你可以用dplyr (&gt;= 0.7.0) 做这样的事情:


library(dplyr)
# quo is a tidy eval concept for quoting
grp_var <-quo(Species)
voi <- quo(Sepal.Length)
# use !! another tidy eval concept to unquote
dmp <- iris %>%
  select(!! grp_var, !! voi) %>% 
  group_by(!! grp_var) %>%
  summarise(Median_Value = median( !! voi ), Count = n())
dmp
#> # A tibble: 3 x 3
#>      Species Median_Value Count
#>       <fctr>        <dbl> <int>
#> 1     setosa          5.0    50
#> 2 versicolor          5.9    50
#> 3  virginica          6.5    50

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2018-09-07
    • 2016-02-02
    • 1970-01-01
    • 2019-10-14
    • 2018-04-27
    • 2015-04-17
    • 2019-01-05
    • 2023-03-06
    相关资源
    最近更新 更多