【发布时间】:2017-12-08 01:37:44
【问题描述】:
最好用一个例子来解释。
我有一个来自data.frame 的向量或列,名为vec:
vec <- c(NA, NA, 1, NA, NA, NA, NA, 1, NA, NA, NA, NA, NA, NA)
我想要一个矢量化过程(不是for 循环)在观察到1 时更改三个尾随NA。
结束向量是:
c(NA, NA, 1, 1, 1, 1, NA, 1, 1, 1, 1, NA, NA, NA)
如果我们有:
vec <- c(NA, NA, 1, NA, 1, NA, NA, 1, NA, NA, NA, NA, NA, NA)
结束向量如下所示:
c(NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA)
一个写得很糟糕的解决方案是:
vec2 <- vec
for(i in index(v)){
if(!is.na(v[i])) vec2[i] <- 1
if(i>3){
if(!is.na(vec[i-1])) vec2[i] <- 1
if(!is.na(vec[i-2])) vec2[i] <- 1
if(!is.na(vec[i-3])) vec2[i] <- 1
}
if(i==3){
if(!is.na(vec[i-1])) vec2[i] <- 1
if(!is.na(vec[i-2])) vec2[i] <- 1
}
if(i==2){
if(!is.na(vec[i-1])) vec2[i] <- 1
}
}
【问题讨论】:
-
Welp,R 中没有矢量化的
seq。我能想到的最接近的方法是使用Vectorize,如seq2 <- Vectorize(seq.default, vectorize.args = c("from", "to")) ; indx <- which(!is.na(vec)) ; vec[seq2(indx, indx + 3)] <- 1。取自here。但话又说回来,Vectorize只是mapply。所以你可以用 Rcpp 写一个 vecotrizedseq可能 -
@raymkchow 谢谢没有找到那个帖子。让每个人都想办法解决,我除了跑得更快的那个。
-
@dimitris_ps 如果接受的答案是您正在寻找的(不是矢量化解决方案),那么这与我在原始评论中发布的完全一样,这只是一个骗局。跨度>
标签: r