通过R中的for循环内的if函数设置某些行的值

时间:2019-11-24 01:43:43

标签: r

满足条件后,我想在列中为特定数量的行数设置特定值。

我的数据如下:

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对象显示了我要完成的工作。

感谢您的帮助。

2 个答案:

答案 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]