在R中创建从循环中的向量

时间:2012-06-27 23:00:25

标签: r

我基本上试图创建一个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等)。但是我不能以这种格式保存它,所以我可以稍后在矩阵中调用它。有什么建议?我已经尝试创建一个没有任何东西的向量然后在循环中填充它,但这也无济于事。

利兹 统计学生

2 个答案:

答案 0 :(得分:3)

在我有很多顽固之后,我已经学会完全将这些东西矢量化,不确定这对你的特殊情况是否有帮助,但我会写:

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

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

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

写下没有NAs时会得到的数字

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

获取一个填充了NAs的正确大小的向量

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)

答案 1 :(得分: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
>