如何矢量化条件循环

时间:2017-03-10 16:30:53

标签: r for-loop vectorization multiple-conditions

我有4种说明,比如 I1,I2,I3,I4 ,我必须根据以下概率在程序中操作这些指令:
- 有1%的几率,我使用 I1
- 有85%的几率,我使用 I2
- 有7%的几率,我使用 I3
- 有7%的几率,我使用 I4
(注意:1%+ 85%+ 7%+ 7%= 100%)

每条指令创建一个2坐标点(x,y),我在数据框 df 中堆叠。

我知道我可以使用以下代码执行此操作:

df <- c(0,0)
for (i in 1:n)
  {
x <- sample(1:100, 1)
if (x==1) { I1 }
if (x>=2 & x<=86) { I2 }
if (x>=87 & x<=93) { I3 }
if (x>=94 & x<=100) { I4 }
df <- rbind(df, c(x, y))
  }

但就“ n ”而言,这是非常耗时的。我想对代码进行矢量化,以加快处理速度,但我找不到如何 有什么想法吗?

完全理解:该计划旨在重现所谓的巴恩斯利蕨类植物。

A1 <- matrix(c(0,0,0,0.16), byrow=FALSE, ncol=2)
V1 <- matrix(c(0,0), byrow=FALSE, ncol=1)
A2 <- matrix(c(0.85,-0.04,0.04,0.85), byrow=FALSE, ncol=2)
V2 <- matrix(c(0,1.6), byrow=FALSE, ncol=1)
A3 <- matrix(c(0.2,0.23,-0.26,0.22), byrow=FALSE, ncol=2)
V3 <- matrix(c(0,1.6), byrow=FALSE, ncol=1)
A4 <- matrix(c(-0.15,0.26,0.28,0.24), byrow=FALSE, ncol=2)
V4 <- matrix(c(0,0.44), byrow=FALSE, ncol=1)

z1 <- matrix(c(0,0), byrow=FALSE, ncol=1)

df <- as.data.frame(t(z1))

for (i in 1:1000)
  {
x <- sample(1:100, 1)

if (x==1) { z2 <- A1%*%z1 + V1}
if (x>=2 & x<=86) { z2 <- A2%*%z1 + V2}
if (x>=87 & x<=93) { z2 <- A3%*%z1 + V3}
if (x>=94 & x<=100) { z2 <- A4%*%z1 + V4}

df <- rbind(df, t(z2))
z1 <- z2
  }

plot(df$V1, df$V2, xlab="", ylab="")

1 个答案:

答案 0 :(得分:0)

采样功能可以进行矢量化。这是一个可以满足您需求的简单示例。

 n<- 100
 sampling<- sample( c(I1(), I2(), I3(), I4()), n, replace=TRUE, prob=c(1,85,7,7))     

 df <- data.frame( x=1:n, y=sampling)


 #run these lines first
 #define your functions
 I1 <- function() { return(10)}
 I2 <- function() { return(20)}
 I3 <- function() { return(30)}
 I4 <- function() { return(40)}

这应该是你所需要的。只需记住在尝试评估样本函数之前定义函数。

注意:阅读完编辑后,说明不是常数,但会根据先前的值而有所不同,因此上述方法不起作用。