如何将3个值更改为向量中的集合,例如:
v=c(1,1,1,1,1,6,2,3,4,4,4,4,4,2)
r=v[which(v %in% c(6,2,3))] = c(6,0,8)
r
[1] 1 1 1 1 1 6 0 8 4 4 4 4 4 6
结果出现警告:要替换的项目数量不是替换长度的倍数。
我需要的想法是:
[1] 1 1 1 1 1 6 0 8 4 4 4 4 4 2
我只希望将3个值作为一个集合/组进行更改,而不是单独更改,任何建议都会非常感激!
编辑: 我很抱歉,实际上我的数据中有不止一组6,2,3,示例应该是这样的:
v=c(1,1,2,1,1,6,2,3,4,4,4,4,4,2,6,2,3,4)
结果是:
[1] 1 1 2 1 1 6 0 8 4 4 4 4 4 2 6 0 8 4
答案 0 :(得分:4)
您可以使用rollapply
包中的zoo
:
rollapply(v, width=3, function(x) all(x == c(6, 2, 3)))
# [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
然后您可以使用该布尔值替换所需的值:
s <- which(rollapply(v, width=3, function(x) all(x == c(6, 2, 3))))
v[s:(s+2)] <- c(6, 0, 8)
在一个快乐的功能中:
rolling_replace <- function(v, p, r) {
l <- length(r)
s <- which(rollapply(v, width=l, function(x) all(x == p)))
v[s:(s+l-1)] <- r
return (v)
}
答案 1 :(得分:1)
使用rle
seqrepl <- function(v,find,repl) {
l <- length(find)
rv <- rle(v %in% find)
start <- cumsum(rv$lengths)[which(rv$lengths==l & rv$values==TRUE)-1]+1
v[start:(start+(l-1))] <- repl
v
}
结果:
seqrepl(v=v,find=c(6,2,3),repl=c(6,0,8))
#[1] 1 1 1 1 1 6 0 8 4 4 4 4 4 2
使用embed
的替代方案:
seqrepl2 <- function(v,find,repl) {
l <- length(find)
start <- which(colSums(t(embed(v,l)) == rev(find)) == l)
v[start:(start+(l-1))] <- repl
v
}
seqrepl2(v=v,find=c(6,2,3),repl=c(6,0,8))
#[1] 1 1 1 1 1 6 0 8 4 4 4 4 4 2
答案 2 :(得分:1)
使用正则表达式的完全不同的方式:
as.numeric(strsplit(gsub("6 2 3", "6 2 8", paste(v, collapse = " ")), " ")[[1]])
# [1] 1 1 1 1 1 6 2 8 4 4 4 4 4 2
这将替换c(6, 2, 3)
的所有实例。