R - 替换序列中的值

R - replace values in a sequence

我有一个包含 1 到 10 数字的向量,例如

c(2, 1, 1, 2, 2, 2, 1, 3)

每当有一个前后跟一个不同的数字时,我想将这些数字加在一起并将1替换为NA

所以我们得到:

c(2, 1, 1, 2, 2, 5, NA, 5)

这很简单,但是当前后数字可能重合时我遇到了问题,例如:

c(8, 7, 1, 6, 1, 5, 3, 4)

应该给

c(8, 18, NA, NA, NA, 18, 3, 4)

有人知道如何解决这个问题吗?非常感谢!

一个例子是

x <- c(2, 1, 1, 2, 2, 2, 1, 3, 8, 7, 1, 6, 1, 5, 3, 4)

# should be transformed to 

x[6] <- 5
x[7] <- NA
x[8] <- 5
x[10] <- 18
x[11] <- NA
x[12] <- NA
x[13] <- NA
x[14] <- 18

更清洁的解决方案。让我们来看一个更复杂的案例

#sample vector
x <- c(1, 2, 1, 1, 2, 2, 2, 1, 3, 8, 7, 1, 6, 1, 5, 3, 4, 1, 5, 1, 4, 5, 1, 7, 5, 1, 3, 1)
[1] 1 2 1 1 2 2 2 1 3 8 7 1 6 1 5 3 4 1 5 1 4 5 1 7 5 1 3 1

#identify positions of 1 satisfying the criteria
pos <- which(x == 1)[!which(x == 1) %in% c((which(x == 1) + 1), (which(x == 1) -1))]

#removing first and last positions if any
pos <- setdiff(pos, c(1,length(x)))

#identifying positions satisfying the second criteria
pos2 <-  pos[pos %in% c(pos + 2, pos -2)]

#identifying positions for first criteria
pos1 <- setdiff(pos, c(pos2, length(x)))

#modifying positions (second criteria)
pos2 <- pos2[pos2 %in% (pos2 -2)] +1

#replacing values satisfying first condition
x[pos1 -1] <- x[pos1 -1] + x[pos1 +1]
x[pos1 +1] <- x[pos1 -1]
x[pos1] <- NA

#replacing values satisfying second condition
x[pos2 -2] <- x[pos2 -2] + x[pos2 +2] + x[pos2]
x[pos2 +2] <- x[pos2 -2]
x[c(pos2, pos2-1, pos2+1)] <- NA

#check the output
x
 [1]  1  2  1  1  2  2  5 NA  5  8 18 NA NA NA 18  3 13 NA NA NA 13 12 NA 12  8 NA  8  1