如何循环将列添加到数据框的命令?

时间:2019-11-25 23:39:38

标签: r loops for-loop

我想为每年添加一个虚拟变量,如果某人在该年退休,则将其值设置为1,否则将值设置为0。到目前为止,我一直在这样做:

df$DummyRetired1987 <- with(df, ifelse(Empl_1987 == 4, 1, 0))
df$DummyRetired1988 <- with(df, ifelse(Empl_1988 == 4, 1, 0))
df$DummyRetired1989 <- with(df, ifelse(Empl_1989 == 4, 1, 0))
df$DummyRetired1990 <- with(df, ifelse(Empl_1990 == 4, 1, 0))
df$DummyRetired1991 <- with(df, ifelse(Empl_1991 == 4, 1, 0))
df$DummyRetired1992 <- with(df, ifelse(Empl_1992 == 4, 1, 0))

这很好用,但是我知道必须有一种更简洁的方法来执行此操作,可能是作为for循环。

我已经尝试过了:

for(year in c(1987,1988,1989,1990,1991,1992)){
  nam1 <- paste("df$DummyRetired", year, sep = "")
  nam2 <- paste("Empl_", year, sep = "")

  assign(nam1, with(df, ifelse(nam2 == 4, 1, 0)))
}

但这不起作用。

将感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我们可以使用grep子集感兴趣的列('nm1'),使用paste创建新的列名称,并将逻辑表达式的输出分配为二进制

nm1 <-  grep("^Empl_\\d+$", names(df), value = TRUE)
nm2 <- paste0("DummyRetired", sub("\\D+", "", nm1))
df[nm2] <- +(df[nm1] == 4)

如果我们需要循环

for(i in seq_along(nm1)) {
      df[[nm2[i]]] <- as.integer(df[[nm1[i]]] == 4)
 }