满足条件后,我想在列中为特定数量的行数设置特定值。
我的数据如下:
mydat1 <- data.frame(ID=rep(1,20),VID=c(rep(0,12),1,rep(0,7)),FLAG =c(rep(0,12),1,rep(0,7)),DT=rep(0,20))
mydat2 <- data.frame(ID=rep(2,20),VID=c(rep(0,7),1,rep(0,12)),FLAG =c(rep(0,7),1,rep(0,12)),DT=rep(0,20))
test <- rbind(mydat1,mydat2)
我希望它看起来像这样:
repdat1 <- data.frame(ID=rep(1,20),VID=c(rep(0,12),1,rep(0,7)),FLAG =c(rep(0,12),1,rep(0,7)),DT=c(rep(0,12),rep(2,8)))
repdat2 <- data.frame(ID=rep(2,20),VID=c(rep(0,7),1,rep(0,12)),FLAG =c(rep(0,7),1,rep(0,12)),DT=c(rep(0,7),rep(2,8),rep(0,5)))
wantdat <- rbind(repdat1,repdat2)
所以我要完成的是,对于特定的行,如果VID和FLAG列都等于1,那么我希望该行的DT列以及随后的7行为2。
我正在if
循环中使用for
函数,如下所示:
for(i in 1:nrow(test)) {
if (test$VID[i]==1 & test$FLAG[i]==1) {
test$DT[i] <- 2
test$DT[i:i+7] <- 2
}
}
执行此操作时,我仅在VID = 1和FLAG = 1时设置DT = 2,并且在满足此条件后第七行设置。中间的行不会设置为2。
上面的wantdat对象显示了我要完成的工作。
感谢您的帮助。
答案 0 :(得分:3)
我们首先可以找到满足条件的索引,然后创建下一个7个索引的序列并将其替换为2。
inds <- which(test$VID == 1 & test$FLAG == 1)
test$DT[c(mapply(`:`, inds, inds + 7))] <- 2
test
# ID VID FLAG DT
#1 1 0 0 0
#2 1 0 0 0
#3 1 0 0 0
#4 1 0 0 0
#5 1 0 0 0
#6 1 0 0 0
#7 1 0 0 0
#8 1 0 0 0
#9 1 0 0 0
#10 1 0 0 0
#11 1 0 0 0
#12 1 0 0 0
#13 1 1 1 2
#14 1 0 0 2
#15 1 0 0 2
#16 1 0 0 2
#17 1 0 0 2
#18 1 0 0 2
#...
答案 1 :(得分:0)
这里是data.table
library(data.table)
ind <- setDT(test)[, {i1 <- .I[VID == 1 & FLAG == 1]
unique(i1 + rep(seq_len(7), length(i1)))}]
test[ind, DT := 2]