我想将参数传递给使用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()
答案 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