在编程中使用 dplyr mutate()
use dplyr mutate() in programming
我正在尝试使用 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
一起使用。
如有任何帮助,我们将不胜感激。
基础 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
所以我只是将基础 R 与 mutate
结合起来
new <- function(Name){
df=mutate(df,ifelse(x <50, "small", "big"))
names(df)[3]=Name
return(df)
}
new("newVar")
使用 dplyr
0.7.1 及其在 NSE 中的进步,您必须 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")
这个returns
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
在 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
我正在尝试使用 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
一起使用。
如有任何帮助,我们将不胜感激。
基础 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
所以我只是将基础 R 与 mutate
new <- function(Name){
df=mutate(df,ifelse(x <50, "small", "big"))
names(df)[3]=Name
return(df)
}
new("newVar")
使用 dplyr
0.7.1 及其在 NSE 中的进步,您必须 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")
这个returns
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
在 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