R -替换序列中的值

  • 本文关键字:替换 r sequence
  • 更新时间 :
  • 英文 :


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

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

每当1的前面和后面有一个不同于1的数字时,我想把这些数字加在一起并用NA代替1

我们得到:

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

相关内容

  • 没有找到相关文章

最新更新