R中1s和-1s的滤波器向量

R中1s和-1s的滤波器向量,r,for-loop,vectorization,R,For Loop,Vectorization,我想对以下向量应用几个过滤器: v <-c(1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1

我想对以下向量应用几个过滤器:

v <-c(1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1-1,1,1,1)

v您可以轻松地将其转换为Rcpp:

#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
IntegerVector myfilter(IntegerVector x){
对于(int i=1;i<(x.size()-1);i++){
如果(x(i-1)=-1&&x(i+1)=-1&&x(i)==1){
x(i)=-1;
}    
}
对于(int i=2;i<(x.size()-1);i++){
如果(x(i-2)=-1&&x(i-1)=1&&x(i+1)=-1&&x(i)==1){
x(i)=-1;
x(i-1)=-1;
}    
}  
返回x;
}
在R中测试它:


t1例如
t[t==1]您的循环正在原地修改数据。他们可能没有完全按照您的预期进行操作……您是否可以添加一个示例,说明for循环与
粘贴的矢量化解决方案不匹配?对于您提供的向量,第一个For循环的输出与向量化解决方案完全匹配。西蒙:我已经把它改成了v,t1和t2詹姆斯:这就是他的想法,在下面的循环步骤中使用一组元素的变化约瑟伯:你是对的,我仍然在努力培养良好的习惯。我在问题的末尾添加了一个完整的例子谢谢你罗兰!我花了一段时间才明白你写的代码是C++,这真是个好主意!我尝试应用代码,但首先需要了解Rcpp和C++基础知识(这对我的项目有很大帮助)
v <-c(1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1-1,1,1,1)
t1 <- v
t2 <- v
for (i in 2:(length(t1)-1)) {
        if (t1[i-1]==-1 & t1[i+1]==-1 & t1[i]==1){
                t1[i] <- -1   
        } 
}
for (i in 2:(length(t1)-1)) {
        if (t1[i-1]==1 & t1[i+1]==1 & t1[i]==-1){
                t1[i] <- 1
        } 
}
for (i in 3:(length(t1)-1)) {
        if (t1[i-2]==-1 & t1[i+1]==-1 & t1[i]==1 & t1[i-1] ==1) {
                t1[i]   <- -1
                t1[i-1] <- -1
        }
}
for (i in 3:(length(t1)-1)) {
        if (t1[i-2]==1 & t1[i+1]==1 & t1[i]==-1 & t1[i-1] ==-1) {
                t1[i]   <- 1
                t1[i-1] <- 1
        }
}
for (i in 4:(length(t1)-1)) {
        if (t1[i-3]==-1 & t1[i+1]==-1 & t1[i-2]==1 & t1[i-1] ==1 & t1[i] ==1) {
                t1[i-2]   <- -1
                t1[i-1]   <- -1
                t1[i]     <- -1
        }
}
for (i in 4:(length(t1)-1)) {
        if (t1[i-3]==1 & t1[i+1]==1 & t1[i-2]==-1 & t1[i-1] ==-1 & t1[i] ==-1) {
                t1[i-2]   <- 1
                t1[i-1]   <- 1
                t1[i]     <- 1
        }
}
for (i in 5:(length(t1)-1)) {
        if (t1[i-4]==-1 & t1[i+1]==-1 & t1[i-3]==1 & t1[i-2]==1 & t1[i-1] ==1 & t1[i] ==1) {
                t1[i-3]   <- -1
                t1[i-2]   <- -1
                t1[i-1]   <- -1
                t1[i]     <- -1
        }
}
for (i in 5:(length(t1)-1)) {
        if (t1[i-4]==1 & t1[i+1]==1 & t1[i-3]==-1 & t1[i-2]==-1 & t1[i-1] ==-1 & t1[i] ==-1) {
                t1[i-3]   <- 1
                t1[i-2]   <- 1
                t1[i-1]   <- 1
                t1[i]     <- 1
        }
}
t2 <- paste(v, collapse="")
t2 <- gsub("-11-1", "-1-1-1", t2)
t2 <- gsub("1-11", "111", t2)
t2 <- gsub("-111-1", "-1-1-1-1", t2)
t2 <- gsub("1-1-11", "1111", t2)
t2 <- gsub("-1111-1", "-1-1-1-1-1", t2)
t2 <- gsub("1-1-1-11", "11111", t2)
t2 <- gsub("-11111-1", "-1-1-1-1-1-1", t2)
t2 <- gsub("1-1-1-1-11", "111111", t2)

t2 <-as.integer(strsplit(t2, "(?<=\\d)", perl = TRUE)[[1]])
all.equal(t1, t2)