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
fromdata.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
fromdata.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中。