r如何更改矢量值?

时间:2014-01-31 20:19:42

标签: r

如何将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

3 个答案:

答案 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

的基本R函数
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)的所有实例。