【问题标题】:Dplyr conditional column ifelse with vector input带有向量输入的 Dplyr 条件列 ifelse
【发布时间】: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 &gt;= 0.5 &amp; df$Y &gt;= 0.5, ColToChange] &lt;- ToChangeTo
  • @alistaire 与堆栈上的大多数问题一样,示例的简单性掩盖了更复杂的应用程序......
  • 没关系;由于它的 NSE,复杂性仅存在于 dplyr 中,因此 不能 存在于基础 R 中。为已知变量编写 dplyr(即进行分析)由于其 NSE 而容易得多,但编程(即编写包)通常在基础 R 中更容易,因为它的 SE。

标签: r dplyr nse rlang


【解决方案1】:

您需要先使用rlang:symColToChange 评估为符号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

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 2020-01-26
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多