我有一个名为“出勤”的变量,可跟踪一个人的每日出勤情况。如果它包含“a”,则该人在第一天出席,“b”如果该人出席第二天,如果该人出席第五天则一直到“e”。因此,如果他们分别参加前三天,最后三天或第一/第三/最后几天,那么有些人的出勤率看起来像“abc”或“cde”或“ace”。
现在我想创建一个变量“day_1”,如果“attendance”包含“a”则等于1,否则为0。然后变量“day_2”等于2,如果“出勤”包含“b”,否则为0。依此类推,直到“day_5”
我已尝试使用grep函数手动执行此操作。这是我到目前为止所尝试的:
test <- data.frame(hhid = c(1:5),attendance=c("abc","bcd","d","ec","ade"))
test$day_1 <- 0
test$day_2 <- 0
test$day_3 <- 0
test$day_1[grep("a", test$attendance, "day_1")] <- "1"
test$day_2[grep("b", test$attendance, "day_2")] <- "1"
test$day_3[grep("c", test$attendance, "day_3")] <- "1"
在R中有更快的方法吗?
非常感谢!
答案 0 :(得分:0)
由于您还没有共享任何样本数据,我创建了一个示例向量来为您提供一个想法。
test <- data.frame(hhid = c(1:5),attendance=c("abc","bcd","d","ec","ade"))
b = as.list(letters[1:5])
abc <- function(i){
ifelse(grepl(b[[i]], test$attendance),1,0)
}
m=sapply(seq_along(b), abc)
colnames(m)=paste("day",1:5,sep="_")
test <- cbind(test,m)