【问题标题】:Using dplyr summarise in R with dynamic variable在具有动态变量的 R 中使用 dplyr 汇总
【发布时间】:2017-01-08 05:01:13
【问题描述】:

我正在尝试使用 R 中的 dplyr 中的汇总和分组依据,但是当我使用变量代替显式调用汇总列时,它使用每行的整个数据集的 dist 总和,而不是正确分组。这可以很容易地从下面的 TestBad 和 TestGood 之间的区别中看出。我只是希望能够像在 TestBad 中一样使用 GraphVar 变量来复制 TestGood 的结果。

    require("dplyr")
    GraphVar <- "dist"

    TestBad <- summarise(group_by_(cars,"speed"),Sum=sum(cars[[GraphVar]],na.rm=TRUE),Count=n())

    testGood <- summarise(group_by_(cars,"speed"),Sum=sum(dist,na.rm=TRUE),Count=n())

谢谢!

【问题讨论】:

  • 您需要来自 dplyr 的标准评估函数。查看示例 herense vignette here
  • @aosmith 他们已经在使用标准评估 (group_by_) 并且遇到了麻烦,我认为。

标签: r dplyr


【解决方案1】:

2020 年 2 月,rlang 包中提供了 tidyeval 工具。特别是,如果使用字符串,您可以使用.data 代词。

library(dplyr)
GraphVar = "dist"
cars %>%
     group_by(.data[["speed"]]) %>%
     summarise(Sum = sum(.data[[GraphVar]], na.rm = TRUE),
               Count = n() )

虽然它们将在 dplyr 1.0.0 中被取代(但不会被弃用),但作用域帮助器 *_at() 函数在处理字符串时很有用。

cars %>%
     group_by_at("speed") %>%
     summarise_at(.vars = vars(GraphVar), 
                  .funs = list(Sum = ~sum(., na.rm = TRUE),
                               Count = ~n() ) )

在 2016 年,您需要标准评估函数 summarise_() 以及 lazyeval::interp()。这在 2020 年仍然有效,但已被弃用。

library(lazyeval)
cars %>%
    group_by_("speed") %>%
    summarise_(Sum = interp(~sum(var, na.rm = TRUE), var = as.name(GraphVar)), 
             Count = ~n() )

【讨论】:

  • 此用法已弃用
  • @user680111 是的,这个答案来自 2016 年,早于当前的 tidyeval 方法。是要求更新答案还是其他什么?
  • 是的 - 更新将不胜感激。 dplyr中动态变量选择的大部分解决方案都对应过时的用法
  • @user680111 我昨天更新了。有趣的是,旧方法虽然已被弃用,但仍然有效。
  • 如何为多个变量做 .data 发音
【解决方案2】:

按名称引用一个或多个列的最新用法似乎是

cars %>% group_by(across("speed")) %>% ...
cars %>% group_by(across(c("speed", "dist"))) %>% ...

参见vignette("colwise"),部分Other verbs

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2020-11-04
    • 1970-01-01
    • 2018-04-01
    • 2018-09-22
    相关资源
    最近更新 更多