Более компактный ответ из комментария @RonakShah:
df$b[unlist(mapply(`:`, which(df$b == "start") + 1, which(df$b == "end") - 1))] <- 1
Оригинальный ответ
Логика, аналогичная приведенному выше компактному ответу, с использованием lapply
здесьмы находим начальную и конечную позиции, сопоставляем это со списком и находим индекс, затем заменяем индекс на 1,
starting <- which(b == "start")
ending <- which(b == "end")
my.ls <- lapply(Map(c, starting, ending), function(x) (x[1]+1):(x[2]-1))
index <- unlist(my.ls)
b[index] <- 1
df <- data.frame(a, b)
df
a b
1 1 0
2 2 0
3 3 start
4 4 1
5 5 1
6 6 1
7 7 end
8 8 0
9 9 0
10 10 start
11 11 1
12 12 end
13 13 0
14 14 0
Ответ по старому циклу
Youмогут использовать функции which следующим образом: сначала определить все начальные и конечные точки, затем выполнить цикл и изменить их на 1 ...
a <- seq(1:14)
b <- c(0, 0, "start", 0, 0, 0, "end", 0, 0, "start", 0, "end", 0, 0)
starting <- which(b == "start")
ending <- which(b == "end")
for (i in 1:length(starting)){
index <- (starting[i]+1):(ending[i]-1)
b[index] <- 1
}
df <- data.frame(a, b)
df