【发布时间】:2018-01-04 18:42:23
【问题描述】:
我正在尝试使用 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,而是向量。
【问题讨论】:
-
fwiw,这在基础 R 中是微不足道的:
df[df$X >= 0.5 & df$Y >= 0.5, ColToChange] <- ToChangeTo -
@alistaire 与堆栈上的大多数问题一样,示例的简单性掩盖了更复杂的应用程序......
-
没关系;由于它的 NSE,复杂性仅存在于 dplyr 中,因此 不能 存在于基础 R 中。为已知变量编写 dplyr(即进行分析)由于其 NSE 而容易得多,但编程(即编写包)通常在基础 R 中更容易,因为它的 SE。