如何将dplyr中的动态列名传递给自定义函数?

时间:2015-04-16 14:52:43

标签: r dynamic dataset dplyr names

我有一个具有以下结构的数据集:

Classes ‘tbl_df’ and 'data.frame':  10 obs. of  7 variables:
 $ GdeName  : chr  "Aeugst am Albis" "Aeugst am Albis" "Aeugst am Albis" "Aeugst am Albis" ...
 $ Partei   : chr  "BDP" "CSP" "CVP" "EDU" ...
 $ Stand1971: num  NA NA 4.91 NA 3.21 ...
 $ Stand1975: num  NA NA 5.389 0.438 4.536 ...
 $ Stand1979: num  NA NA 6.2774 0.0195 3.4355 ...
 $ Stand1983: num  NA NA 4.66 1.41 3.76 ...
 $ Stand1987: num  NA NA 3.48 1.65 5.75 ...

我想提供一个允许计算任何值之间差异的函数,我想使用dplyr s mutate函数这样做:(假设参数{{1} }和from作为参数传递)

to

当然,这不起作用,因为from <- "Stand1971" to <- "Stand1987" data %>% mutate(diff = from - to) 使用非标准评估。而且我知道现在使用dplyr来解决问题的优雅方法,我已经阅读了this vignette,但我仍然无法理解它。

怎么办?

以下是可重现示例

的数据集的前几行
mutate_

2 个答案:

答案 0 :(得分:15)

使用最新版本的dplyr(&gt; = 0.7),您可以使用rlang !!(bang-bang)运算符。

library(tidyverse)
from <- "Stand1971"
to <- "Stand1987"

data %>%
  mutate(diff=(!!as.name(from))-(!!as.name(to)))

您只需要将字符串转换为as.name的名称,然后将它们插入表达式中。不幸的是,我似乎不得不使用比我想要的更多的括号,但!!运算符似乎属于一种奇怪的操作顺序。

原始答案,dplyr(0.3- <0.7):

从那个小插图(vignette("nse","dplyr"))中,使用lazyeval的interp()函数

library(lazyeval)

from <- "Stand1971"
to <- "Stand1987"

data %>%
  mutate_(diff=interp(~from - to, from=as.name(from), to=as.name(to)))

答案 1 :(得分:3)

您现在可以在 .data 链中使用 dplyr

library(dplyr)
from <- "Stand1971"
to <- "Stand1987"

data %>% mutate(diff = .data[[from]] - .data[[to]])

另一种选择是将 sym 与 bang-bang (!!) 一起使用

data %>% mutate(diff = !!sym(from) - !!sym(to))

在基础 R 中,我们可以使用:

data$diff <- data[[from]] - data[[to]]