2

我基本上是在尝试创建一个由 NA 和数字组成的向量,但顺序非常特殊。这是我到目前为止的代码:

x<-rep(rep(2:1,c(2,3)),40)
dummy=1
for (i in 0:length(x))
{ ifelse(x[i+1]==2, print(NA), print(dummy))
 if(i %% 5 == 0) dummy=i+1
}

所以我的向量应该如下所示(NA、NA、1、1、1、NA、NA、6、6、6 等)。但是我不能以这种格式保存它,所以我可以稍后在矩阵中调用它。有什么建议么?我尝试过创建一个什么都没有的向量,然后将其填充到循环中,但这也无济于事。

利兹统计学生

4

2 回答 2

3

经过我的很多固执之后,我学会了将这些东西完全矢量化,不确定这是否有助于您的特定情况,但我会写:

x<-rep(rep(2:1,c(2,3)),40)

通过以下方式获得 x 的领先优势:

leadx=c(x[-1],NA)

写出没有 NA 时你会得到的数字

filler=rep(5*0:7+1,each=5)

得到一个用 NA 填充的正确大小的向量

y=rep(NA,length(x))

将填充器的值插入到您的 NA 向量中

y[which(leadx!=2)]=filler[which(leadx!=2)]

检查出来:

head(y)

> [1] NA  1  1  1 NA NA  6  6  6 NA

向量化的东西往往比 for 循环和 if 语句更快。祝你好运!

编辑:您可以在一行中完成所有操作:

y=ifelse(c(x[-1],NA)==2,NA,1)*rep(5*0:7+1,each=5)
于 2012-06-27T23:42:30.033 回答
2

您需要将向量分配给某些东西,而不是调用print,否则它将打印到标准输出。

out <- vector(length=length(x))

for (i in 0:length(x)) { 
  out[i] <- ifelse(x[i+1]==2, NA, dummy)
  if(i %% 5 == 0) dummy=i+1
}

> head(out, 10)
 [1] NA  1  1  1 NA NA  6  6  6 NA
> 
于 2012-06-27T23:03:22.297 回答