根据现有变量创建长变量列表

时间:2017-09-29 19:05:43

标签: r

我有很长的变量列表,每个我想创建一个虚拟变量。我使用下面的dplyr mutate代码来执行此操作,但是知道可以使用类似SAS中的数组(因此我不必多次复制此行)。我还没有能够在Stack或其他适合的地方找到答案。

Grade_Dist2 <- Grade_Dist2 %>% mutate(
   ACCT2301_FA15_z = ifelse(ACCT2301_FA15 %in% c("A", "B", "C"), 1, 
       ifelse(ACCT2301_FA15 %in% c("D", "F", "W", "Q"), 0, NA)))

列/变量排列在一起 - 除了ID变量

之外,表中的所有变量都是相似的

2 个答案:

答案 0 :(得分:1)

在tidyverse中,你应该看看像mutate_all()这样的东西,但在此期间我会认为像这个基础R解决方案的东西会起作用:

all_names <- grep("FA[0-9]+",names(Grade2),value=TRUE)
for (id in all_names) {
    cur_var <- Grade2[[id]]
    Grade2[[paste0(id,"_z")]] <- 
      ifelse(cur_var %in% c("A", "B", "C"), 1, 
         ifelse(cur_var %in% c("D", "F", "W", "Q"), 0, NA)))
}

答案 1 :(得分:1)

根据@BenBolker的建议,尝试使用tidyverse方法mutate_all

library(tidyverse)
Grade_Dist2 <- tibble(ACCT2301_FA15_z = c("A", "F", "C", "Z"))

Grade_Dist2 <- Grade_Dist2 %>% 
  mutate_all(., funs(if_else(. %in% c("A", "B", "C"), 1, 
                             if_else(. %in% c("D", "F", "W", "Q"), 0, NA_real_))))

Grade_Dist2
#> # A tibble: 4 x 1
#>   ACCT2301_FA15_z
#>             <dbl>
#> 1               1
#> 2               0
#> 3               1
#> 4              NA

如果要将虚拟变量附加到现有数据而不是覆盖那么

  mutate_all(., funs("dummy" = if_else(. %in% c("A", "B", "C"), 1, 
                                       if_else(. %in% c("D", "F", "W", "Q"), 0, NA_real_))))

将追加名称为ACCT2301_FA15_z_dummy的变量(如果只有一个变量被突变,则称为dummy。)