UPDATE July 2020:

dplyr 1.0几乎改变了这个问题以及所有答案的一切.请参见此处的dplyr个编程小插曲:

https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

当列的标识符被存储为字符向量时,引用列的新方法是使用rlang中的.data代词,然后使用base R中的子集.

library(dplyr)

key <- "v3"
val <- "v2"
drp <- "v1"

df <- tibble(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))

df %>% 
    select(-matches(drp)) %>% 
    group_by(.data[[key]]) %>% 
    summarise(total = sum(.data[[val]], na.rm = TRUE))

#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 2 x 2
#>   v3    total
#>   <chr> <int>
#> 1 A        21
#> 2 B        19

如果你的代码在一个包函数中,你可以 Select @importFrom rlang .data以避免R判断关于未定义全局变量的注释.

ORIGINAL QUESTION:

我想引用summarise中的一个未知列名.dplyr 0.3中引入的标准求值函数允许使用变量引用列名,但当您在例如summarise中调用base R函数时,这似乎不起作用.

library(dplyr)
 
key <- "v3"
val <- "v2"
drp <- "v1"
 
df <- data_frame(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))

df如下所示:

> df
Source: local data frame [5 x 3]

  v1 v2 v3
1  1  6  A
2  2  7  A
3  3  8  A
4  4  9  B
5  5 10  B

我想删除v1,按v3分组,并对每组的v2求和:

df %>% select(-matches(drp)) %>% group_by_(key) %>% summarise_(sum(val, na.rm = TRUE))

Error in sum(val, na.rm = TRUE) : invalid 'type' (character) of argument

NSE版本的select()运行良好,因为它可以匹配字符串.group_by()的SE版本运行良好,因为它现在可以接受变量作为参数并对其求值.然而,当在dplyr个函数中使用base R函数时,我还没有找到一种实现类似结果的方法.

不起作用的事情:

df %>% group_by_(key) %>% summarise_(sum(get(val), na.rm = TRUE))
Error in get(val) : object 'v2' not found

df %>% group_by_(key) %>% summarise_(sum(eval(as.symbol(val)), na.rm = TRUE))
Error in eval(expr, envir, enclos) : object 'v2' not found

我查了severalrelatedquestions,但到目前为止,没有一个提议的解决方案对我有效.

推荐答案

dplyr 1.0几乎改变了这个问题以及所有答案的一切.请参见此处的dplyr个编程小插曲:

https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

当列的标识符被存储为字符向量时,引用列的新方法是使用rlang中的.data代词,然后使用base R中的子集.

library(dplyr)

key <- "v3"
val <- "v2"
drp <- "v1"

df <- tibble(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))

df %>% 
    select(-matches(drp)) %>% 
    group_by(.data[[key]]) %>% 
    summarise(total = sum(.data[[val]], na.rm = TRUE))

#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 2 x 2
#>   v3    total
#>   <chr> <int>
#> 1 A        21
#> 2 B        19

如果你的代码在一个包函数中,你可以 Select @importFrom rlang .data以避免R判断关于未定义全局变量的注释.

R相关问答推荐

将第二个图放置在ggplot 2中另一个图的x轴上

使用facet_wrap()时如何将面板标题转换为脚注?

使用gggplot 2在R中重新调整面板和y轴文本大小

如何根据包含相同值的某些列获取总额

使用sensemakr和fixest feols模型(R)

MCMC和零事件二元逻辑回归

R Markdown中的交叉引用表

将文件保存到新文件夹时,切换r设置以不必创建目录

对于变量的每个值,仅 Select 包含列表中所有值的值.R

提取第一个下划线和最后一个下划线之间的任何内容,例外情况除外

如何在R中平滑地绘制线图(不拟合)?

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

在带有`R`中的`ggmosaic`的马赛克图中使用图案而不是 colored颜色

如何使用前缀作为匹配来连接数据帧?

WRS2包中带有bwtrim的简单ANOVA抛出错误

在R中使用列表(作为tibble列)进行向量化?

有没有办法一次粘贴所有列

层次树图的数据树

注释不会绘制在所有ggplot2面上

禁用时,SelecizeInput将变得不透明