2017-07-18 89 views
5

我想使用mutate为一个变量指定一个列名。在编程中使用dplyr mutate()

df <-data.frame(x = sample(1:100, 50), y = rnorm(50)) 

new <- function(name){ 
    df%>%mutate(name = ifelse(x <50, "small", "big")) 
} 

当我运行

new(name = "newVar") 

这是行不通的。我知道mutate_()可以帮助,但我很难与ifelse一起使用它。

任何帮助,将不胜感激。

+0

你在'mutate'末尾缺少'''',mutate'拼写错误。另外,在函数中调用像'df'这样的全局变量时要小心。将'df'作为参数传递给你的函数比较安全。 – juan

+0

'mutate_'正在逐步淘汰。更新'dplyr'并输入'vignette'('programming','dplyr')' – Axeman

+0

我的软件包都是最新的。 – Kay

回答

9

使用dplyr 0.7.1及其在NSE进步结合基础R,你必须UQ参数到mutate,然后在分配时使用:=。有很多关于用dplyr和NSE编程的信息:https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

我已将函数参数的名称更改为myvar以避免混淆。如果您有更多类别要重新编码,则还可以使用dplyr中的case_when而不是ifelse

df <- data.frame(x = sample(1:100, 50), y = rnorm(50)) 

new <- function(myvar){ 
    df %>% mutate(UQ(myvar) := ifelse(x < 50, "small", "big")) 
} 

new(myvar = "newVar") 

这将返回

 x  y newVar 
1 37 1.82669 small 
2 63 -0.04333 big 
3 46 0.20748 small 
4 93 0.94169 big 
5 83 -0.15678 big 
6 14 -1.43567 small 
7 61 0.35173 big 
8 26 -0.71826 small 
9 21 1.09237 small 
10 90 1.99185 big 
11 60 -1.01408 big 
12 70 0.87534 big 
13 55 0.85325 big 
14 38 1.70972 small 
15 6 0.74836 small 
16 23 -0.08528 small 
17 27 2.02613 small 
18 76 -0.45648 big 
19 97 1.20124 big 
20 99 -0.34930 big 
21 74 1.77341 big 
22 72 -0.32862 big 
23 64 -0.07994 big 
24 53 -0.40116 big 
25 16 -0.70226 small 
26 8 0.78965 small 
27 34 0.01871 small 
28 24 1.95154 small 
29 82 -0.70616 big 
30 77 -0.40387 big 
31 43 -0.88383 small 
32 88 -0.21862 big 
33 45 0.53409 small 
34 29 -2.29234 small 
35 54 1.00730 big 
36 22 -0.62636 small 
37 100 0.75193 big 
38 52 -0.41389 big 
39 36 0.19817 small 
40 89 -0.49224 big 
41 81 -1.51998 big 
42 18 0.57047 small 
43 78 -0.44445 big 
44 49 -0.08845 small 
45 20 0.14014 small 
46 32 0.48094 small 
47 1 -0.12224 small 
48 66 0.48769 big 
49 11 -0.49005 small 
50 87 -0.25517 big 
+0

':='来自'data.table'? – Wen

+1

@Wen不,我认为':='来自'rlang',0.7.1版本的'dplyr'使用了'rlang'。在这里看到更多的信息:https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html – meenaparam

1

基础R解决方案

df <-data.frame(x = sample(1:100, 50), y = rnorm(50)) 

new <- function(name){ 
    df[,name]='s' 
    df[,name][df$x>50]='b' 
    return(df) 
} 

我使用dplyr 0.5,所以我只是mutate

new <- function(Name){ 

    df=mutate(df,ifelse(x <50, "small", "big")) 
    names(df)[3]=Name 
    return(df) 
} 

new("newVar") 
6

dlyr programming vignette,定义功能如下:

new <- function(name) 
{ 
    nn <- enquo(name) %>% quo_name() 
    df %>% mutate(!!nn := ifelse(x <50, "small", "big")) 
} 

enquo需要其表达参数,并引用它,其次是quo_name其转换成字符串。由于nn现在被引用,因此我们需要告知mutate不要再次引用它。这就是!!的用途。最后,:=是使其有效的R代码的帮助操作符。请注意,根据此定义,只需将newVar而不是"newVar"传递给您的函数,即可保留dplyr样式。

> new(newVar) %>% head 
    x   y newVar 
1 94 -1.07642088 big 
2 85 0.68746266 big 
3 80 0.02630903 big 
4 74 0.18323506 big 
5 86 0.85086915 big 
6 38 0.41882858 small 
+0

接受meenaparam的答案,但你的答案也毫无疑问是一个伟大的,这将有助于在另一个函数我正在写。谢谢 – Kay

+0

同意,我认为这也是一个非常有用的答案! – meenaparam