我想为每年添加一个虚拟变量,如果某人在该年退休,则将其值设置为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)))
}
但这不起作用。
将感谢您的帮助。谢谢!
答案 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)
}