我想知道如何编写一些简单的代码来解决这个问题: 像这样的问题,我有一个这样的矢量:
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;。
答案 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)))