将参数传递给dplyr

时间:2015-04-23 12:47:32

标签: r function arguments dplyr

我想将参数传递给使用dplyr的函数。

我们的想法是转换数据框的特定列(我的参数)的数据。

以下是一个说明性示例:

example = function(x){
  df %>%
    mutate( paste0(x, '_with_noise') = x + rnorm(n(), 0, 0.01))
}

问题是我收到此错误消息:

> Error: unexpected '=' in: "  df %>%
>     mutate( paste(x, '_with_noise', sep = '') ="
> > } Error: unexpected '}' in "}"

我也试过使用这些,但我有完全相同的错误。

  • mutate_代替mutate
  • quote()

3 个答案:

答案 0 :(得分:4)

以下是{1}}的使用方式。

mutate_

在dplyr(example = function(x){ tx <- lazyeval::interp(~z+rnorm(n(), 0, 0.01), z=as.name(x)) tn <- paste0(x, '_with_noise') df %>% mutate_( .dots=setNames(list(tx), tn)) } example("a") example("b") )的NSE插图中有这样的例子。这种方法比粘贴任意字符串和评估结果更安全。

答案 1 :(得分:0)

paste命令在mutate内不起作用,因此最好将变量名称指定给其他变量y

example = function(x){
  y <- paste(x, '_with_noise', sep = '')
  df %>%
    mutate(y = x + rnorm(n(), 0, 0.01))
}

所以,如果您的数据是

a <- c("A","B","C")
b <- c(2,3,4)
df <- data.frame(a,b)

> df
  a b
1 A 2
2 B 3
3 C 4

调用

> example(df$b)

导致结果

  a b        y
1 A 2 2.013845
2 B 3 2.998154
3 C 4 3.987750

答案 2 :(得分:-1)

要制作此技巧,您必须将整个命令放入paste函数中。 顺便说一句,最好使用paste0代替paste(..., sep = '')

这是一个有效的例子。

example = function(x){
  y <- as.character(substitute(x))
  eval(parse(text = paste0(
    "df %>% mutate(", y, "_with_noise =", y, " + rnorm(n(), 0, 0.01) )"
    )))
}

set.seed(99)
df <- as.data.frame(matrix(sample(10, 25, T), ncol = 5, 
                            dimnames = list(NULL, letters[1:5]) ))
example(b)
#    a  b c d e b_with_noise
# 1  6 10 6 7 3     9.996149
# 2  2  7 6 4 1     7.008946
# 3  7  3 2 2 9     2.991608
# 4 10  4 7 1 6     3.995421
# 5  6  2 7 2 8     2.001143