我有一个具有以下结构的数据集:
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_
答案 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]]