带向量输入的 Dplyr 条件列 ifelse
Dplyr conditional column ifelse with vector input
我正在尝试使用 dplyr 的新 NSE 语言方法来创建条件变异,使用向量输入。我遇到问题的地方是将列设置为等于自身,请参见下面的 mwe:
df <- data.frame("Name" = c(rep("A", 3), rep("B", 3), rep("C", 4)),
"X" = runif(1:10),
"Y" = runif(1:10)) %>%
tbl_df() %>%
mutate_if(is.factor, as.character)
ColToChange <- "Name"
ToChangeTo <- "Big"
现在,使用以下内容:
df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, !!ColToChange))
将 ColToChange
值设置为 Name
,而不是恢复到原来的值。因此,我试图使用上面的语法来实现这一点:
df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, Name))
但不是 Name
,而是向量。
您需要先使用rlang:sym
将ColToChange
作为符号Name
求值,然后将其作为列求值!!
:
library(rlang); library(dplyr);
df %>% mutate(!!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, !!sym(ColToChange)))
# A tibble: 10 x 3
# Name X Y
# <chr> <dbl> <dbl>
# 1 A 0.05593119 0.3586310
# 2 A 0.70024660 0.4258297
# 3 Big 0.95444388 0.7152358
# 4 B 0.45809482 0.5256475
# 5 Big 0.71348123 0.5114379
# 6 B 0.80382633 0.2665391
# 7 Big 0.99618062 0.5788778
# 8 Big 0.76520307 0.6558515
# 9 C 0.63928001 0.1972674
#10 C 0.29963517 0.5855646
我正在尝试使用 dplyr 的新 NSE 语言方法来创建条件变异,使用向量输入。我遇到问题的地方是将列设置为等于自身,请参见下面的 mwe:
df <- data.frame("Name" = c(rep("A", 3), rep("B", 3), rep("C", 4)),
"X" = runif(1:10),
"Y" = runif(1:10)) %>%
tbl_df() %>%
mutate_if(is.factor, as.character)
ColToChange <- "Name"
ToChangeTo <- "Big"
现在,使用以下内容:
df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, !!ColToChange))
将 ColToChange
值设置为 Name
,而不是恢复到原来的值。因此,我试图使用上面的语法来实现这一点:
df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, Name))
但不是 Name
,而是向量。
您需要先使用rlang:sym
将ColToChange
作为符号Name
求值,然后将其作为列求值!!
:
library(rlang); library(dplyr);
df %>% mutate(!!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, !!sym(ColToChange)))
# A tibble: 10 x 3
# Name X Y
# <chr> <dbl> <dbl>
# 1 A 0.05593119 0.3586310
# 2 A 0.70024660 0.4258297
# 3 Big 0.95444388 0.7152358
# 4 B 0.45809482 0.5256475
# 5 Big 0.71348123 0.5114379
# 6 B 0.80382633 0.2665391
# 7 Big 0.99618062 0.5788778
# 8 Big 0.76520307 0.6558515
# 9 C 0.63928001 0.1972674
#10 C 0.29963517 0.5855646