r - 使用 mutate 和 for 循环自动分配变量名称

标签 r for-loop assign dplyr

我有一个包含 40 个变量 G1_aG1_b、... 直到 G20_aG20_b 的数据框(源自一项调查)。我想创建 20 个新变量 G1 ... G20 来总结现有变量。

data <- data.frame(G1_a = c(0, 0, 0, 1, NA), 
               G1_b = c(0, 0, 1, 1, NA), 
               G2_a = c(0, 0, 0, 1, NA), 
               G2_b = c(0, 0, 1, 1, NA))

# Reshaping without for-loop:
data <- data %>% 
  mutate(G1 = case_when(
    G1_a == 1 ~ "own_offer", 
    G1_b == 1 ~ "no_offer", 
    T ~ NA_character_
  ))

data <- data %>% 
  mutate(G2 = case_when(
    G2_a == 1 ~ "own_offer", 
    G2_b == 1 ~ "no_offer", 
    T ~ NA_character_
  ))

我想在 for 循环中自动创建新变量,例如:

# Reshaping with for-loop:
for(i in 1:2) {
 data <- data %>% 
   mutate(assign(paste0("G", i), case_when(
     get(paste0("G", i, "_a")) == 1 ~ "own_offer", 
     get(paste0("G", i, "_b")) == 1 ~ "no_offer", 
     T ~ NA_character_
    )))
  }

我的问题包括两部分:

1) 是否可以将 assignmutate 结合起来?我知道像 mutate(df, !!varname := Petal.width * n) (参见 here )这样的方法来动态分配参数名称。但是,我无法将其与我想要运行的数据 reshape 结合起来。

2) dplyr 是否允许将 paste0case_whenmutate 一起使用?

最佳答案

这有点棘手,但我认为这是实现这一目标的原则性方法。最终结果是一个包含所需列的数据框,从而避免了所有 get()/assign()令人头疼(并且不会因为大量派生变量而使工作区变得困惑。)我们通过几个步骤使用 tidyr::gather() 更改数据框的形状(宽 -> 长 -> 部分宽 -> 宽)和tidyr::spread() 。如果这看起来令人难以承受,请尝试在各个中间点停止管道序列,看看到目前为止已取得的成果。

library(tidyr)
library(dplyr)
dds <- (dd
  %>% mutate(case=seq(n()))    ## need a variable to distinguish rows in original data set
  %>% gather(var,val,-case)    ## -> long format: {case, var={G1_a,G1_b,...}, val={0,1,NA}}
  %>% separate(var,c("var","response"))  ## split to "G1","G2" + "a", "b"
  %>% spread(response,val)               ## convert back to semi-wide: {case, var, a, b}
  ## now collapse rows to categorical value, as above
  %>% mutate(offer=case_when(a==1 ~ "own_offer",
                             b==1 ~ "no_offer",
                             TRUE ~ NA_character_))
  %>% select(-c(a,b))          ## clean up now-redundant variables
  %>% spread(var,offer)        ## convert back to wide format: {case, G1, G2, ...}
  %>% select(-case)            ## now redundant
)

结果

         G1        G2
1      <NA>      <NA>
2      <NA>      <NA>
3  no_offer  no_offer
4 own_offer own_offer
5      <NA>      <NA>

关于r - 使用 mutate 和 for 循环自动分配变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52663365/

相关文章:

r - 将 Rmarkdown block 的主体作为参数传递给子文档

javascript - JS中数字原型(prototype)的自定义迭代器

python - python 中循环的奇怪行为

javascript - 将输入值分配给变量

java - 无法将 getBytes() 分配给字节数组

r - tidyr:具有不同 NA 计数的多次取消嵌套

r - 计算组平均值,同时使用dplyr排除当前观察值

r - 为什么 ggplotly 在 rmarkdown 中不能像 ggplot 一样工作

c# - For 循环和 If 语句

swift - 分配总是使复制 swift