我有一个不同值的向量,如果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;能够找到它。
提前致谢!
答案 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)
现在id
为x
提供了匹配块的起始索引。
答案 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