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

R 将二进制向量中每1后面的两个0设置为1,r,vector,R,Vector,我想知道如何编写一些简单的代码来解决这个问题: 像这样的问题,我得到了一个向量: x <- c(0,1,0,0,1,0,0,0,0,1,0) x我们可以使用 id <- rep(which(diff(x) == -1), each = 2) + 1:2 x[id[id <= length(x)]] <- 1 id我们可以使用 id <- rep(which(diff(x) == -1), each = 2) + 1:2 x[id[id <= length(

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

x <- c(0,1,0,0,1,0,0,0,0,1,0)
x我们可以使用

id <- rep(which(diff(x) == -1), each = 2) + 1:2
x[id[id <= length(x)]] <- 1
id我们可以使用

id <- rep(which(diff(x) == -1), each = 2) + 1:2
x[id[id <= length(x)]] <- 1
id另一种解决方案:

sign(Reduce(function(x,y) min(3, max(x-1,0) + y), 3*x, acc=T))
这个
Reduce()
有效地创建了一个计数器,该计数器在0的情况下递减1,在1的情况下重置为3。使用
符号()
可以得到所需的结果。

另一种解决方案:

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

这个
Reduce()
有效地创建了一个计数器,该计数器在0的情况下递减1,在1的情况下重置为3。采用
符号()
可获得所需的结果。

此方法在x向量的移位版本上使用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

该方法在x矢量的移位版本上使用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

下面是另一种使用
shift
from
data.table
的方法。
shift
可以将
n
作为向量,以获得
滞后的
列表
(默认情况下),
通过添加(
+
)列表
的相应元素,将其减少为
向量
,转换为逻辑向量(
.0
-这里它不做此操作)并使用
+
转换为二进制

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


下面是另一种使用
shift
from
data.table
的方法。
shift
可以将
n
作为向量,以获得
滞后的
列表
(默认情况下),
通过添加(
+
)列表
的相应元素,将其减少为
向量
,转换为逻辑向量(
.0
-这里它不做此操作)并使用
+
转换为二进制

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


非常感谢。我用这个来解决我的问题,和你的想法一样,但我不熟悉微分函数。x=c(0,1,0,0,1,0,0,0,0,0,1,0);当然,你可以写答案。谢谢!我用这个来解决我的问题,和你的想法一样,但我不熟悉微分函数。x=c(0,1,0,0,1,0,0,0,0,0,1,0);y 0]当然,您可以编写答案。shift函数为我节省了很多。shift函数为我节省了很多。akrun的答案在data.table包中提供了shift函数,这可以将代码保存在pmax中。akrun的答案在data.table包中提供了shift函数,这可以将代码保存在pmax中。