【问题标题】:Mutate_ variable in a for loopfor循环中的mutate_变量
【发布时间】:2021-12-22 23:43:48
【问题描述】:

我正在尝试使用带有以下代码的循环来改变 8 个变量(Q31_1_ 到 Q31_8_),这给了我以下错误消息:“unexpected '=' in : “Ech_final_nom_BSA % mutate_((as.name(paste("Q31_", i,"_", sep=""))) ="

我做错了什么?

for (i in 1:8) {

Ech_final_nom_BSA <- Ech_final_nom_BSA %>%
  mutate_(as.name(paste("Q31_", i,"_", sep= "")) = case_when(
                    as.name(paste("Q31_", i,"_", sep= "")) == 1 ~ 4,
                    as.name(paste("Q31_", i,"_", sep= "")) == 2 ~ 3,
                    as.name(paste("Q31_", i,"_", sep= "")) == 3 ~ 2,
                    as.name(paste("Q31_", i,"_", sep= "")) == 4 ~ 1,
                    T ~ as.numeric(as.character(as.name(paste("Q31_", i,"_", sep= ""))))
                    ))
}

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案1】:

    不鼓励使用mutate_ (https://dplyr.tidyverse.org/reference/se-deprecated.html)。相反,使用例如mutate_atacross (https://dplyr.tidyverse.org/reference/across.html) 并定义一个类似于您在 case_when 中所做的函数——除了它可能更简单:

    function(x) { ifelse(x %in% 1:4, 4:1[x], x) }
    

    (或者如果您确定 Q31_i 永远不会超出 1:4,它可能会更简单)。

    【讨论】:

      【解决方案2】:

      您不需要 for 循环。您可以将mutateacross 一起使用:

      Ech_final_nom_BSA %>%
        mutate(
          across(matches("^Q31_[1-8]_$"), ~case_when(
            .x %in% 1:4 ~ 4 - .x + 1,
            TRUE ~ .x
          )
          ) 
        )
      

      【讨论】:

      • 感谢赛特!在此期间,我最终使用了带有 base 的循环,但我会牢记您的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2017-03-22
      • 2019-11-19
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多