将二进制向量中每1后的两个0设置为1

时间:2016-12-10 07:34:35

标签: r vector

我想知道如何编写一些简单的代码来解决这个问题: 像这样的问题,我有一个这样的矢量:

x <- c(0,1,0,0,1,0,0,0,0,1,0)

虽然我想做一些计算然后得到y:

y <- c(0,1,1,1,1,1,0,0,1,1)

规则是: 如果您找到1&#39; 1,则将以下2个零替换为&#39; 1&#39;。

4 个答案:

答案 0 :(得分:3)

我们可以使用

id <- rep(which(diff(x) == -1), each = 2) + 1:2
x[id[id <= length(x)]] <- 1
  • tmp <- which(diff(x) == -1)提供1后跟0;
  • 的职位
  • id <- rep(tmp, each = 2) + 1:2表示以下2个职位;
  • 基本上我们想要x[id] <- 1,但是当x在结尾处有1时,这可能会创建一个更长的向量。因此,我们将其约​​束为:x[id[id <= length(x)]] <- 1

答案 1 :(得分:2)

另一种解决方案:

sign(Reduce(function(x,y) min(3, max(x-1,0) + y), 3*x, acc=T))

这个Reduce()有效地创建了一个计数器,在0的情况下减1,在1的情况下重置为3.取sign()得到所需的结果。

答案 2 :(得分:2)

此方法在x-vector的移位版本上使用pmax:

 pmax ( x, c(NA,head(x,-1)) , c(NA,NA,head(x,-2)) , na.rm=TRUE)
 [1] 0 1 1 1 1 1 1 0 0 1 1

答案 3 :(得分:1)

以下是来自shift的{​​{1}}的另一种方法。 data.table可以shift作为向量来获取n list(默认情况下),lag通过添加Reduce vector+list的相应元素,转换为逻辑向量(> 0 - 此处无需执行此操作)并使用+转换为二进制。

library(data.table)
+(Reduce(`+`, shift(x, 0:2, fill=0)) > 0)
#[1] 0 1 1 1 1 1 1 0 0 1 1

或者

sign(Reduce(`+`, shift(x, 0:2, fill=0)))