合并两个连续值

时间:2017-01-24 21:27:07

标签: r

我有一个不同值的向量,如果5后跟3,我想合并并添加两个值。

输入:

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

预期产出:

1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8

正如你所看到的那样,在5之后的两次出现中,两次出现在一起以显示8.我确定有一个简单的功能可以在几秒钟内完成,我只是&不#39;能够找到它。

提前致谢!

3 个答案:

答案 0 :(得分:9)

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

# get indices where 5 followed by 3
fives <- head(vector, -1) == 5 & tail(vector, -1) == 3   

# add three to fives
vector[fives] <- vector[fives] + 3  

# remove threes
vector <- vector[c(TRUE, !fives)] 
vector
# [1] 1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8

答案 1 :(得分:4)

这是一种可能性:

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

A <- rbind(x[-length(x)], x[-1])
id <- which( colSums( abs(A - c(5, 3)) ) == 0 )

x[rbind(id, id + 1L)] <- c(8, NA)
na.omit(x)

建议使用此解决方案,以便更容易扩展到一般情况(可能不能最好地满足OP的需要,但我只是将其作为练习。)

通常,如果您想匹配向量xc中的大块x,我们可以这样做:

A <- t(embed(x, length(xc)))
id <- which(colSums(abs(A - rev(xc))) == 0)

现在idx提供了匹配块的起始索引。

答案 2 :(得分:0)

vector <- c(1, 2, 7, 4, 3, 8, 5, 3, 2, 6, 9, 4, 4, 5, 6, 2, 6, 5, 3)
temp = rev(which((vector == 5) & (vector[-1] == 3)))  # find indexes of 5s followed by 3s

for (t in temp){
  vector = vector[-(t+1)]   # remove threes
  vector[t] = 8             # replace fives with eights
}
vector
# [1] 1 2 7 4 3 8 8 2 6 9 4 4 5 6 2 6 8