我有很长的变量列表,每个我想创建一个虚拟变量。我使用下面的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变量
之外,表中的所有变量都是相似的答案 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
。)