如何避免R中的这个循环(rapply?lapply?)

时间:2014-06-27 12:19:48

标签: r loops lapply mapply

我试图通过一个symple命令替换这个循环而没有任何成功(lapply?rapply?mapply?)。也许在R中一个罕见的情况是真的需要循环吗?

n <- 10
x <- vector(mode="numeric", length=n)

for(i in 2:n) {
    x[i] <- x[i-1]+runif(1)
}

我的问题制定得很糟糕。回复帮助我理解我实际需要的是将向量的值访问到函数中。使用一个对任何函数都很简单的循环&#34; f&#34;我们可以计算出来:

x <- c(1,2,3,4)
for(i in 2:4) {
    x[i] <- f(x[i-1])
}

也许唯一的方法是全局变量?

4 个答案:

答案 0 :(得分:3)

对于您的确切问题,您根本不需要apply功能,因为您可以使用cumsum进行矢量化:

您的代码:

n <- 10
x <- vector(mode="numeric", length=n)

set.seed(1)
for(i in 2:n) {
  x[i] <- x[i-1]+runif(1)
}
x
[1] 0.0000000 0.2655087 0.6376326 1.2104859 2.1186937 2.3203756 3.2187653 4.1634406 4.8242384
[10] 5.4533524

我的代码:

set.seed(1)
c(0, cumsum(runif(n-1)))
 [1] 0.0000000 0.2655087 0.6376326 1.2104859 2.1186937 2.3203756 3.2187653 4.1634406 4.8242384
[10] 5.4533524

答案 1 :(得分:2)

您可以使用cumsum。因此,只需将随机变量向量

的累积和加零
n <- 10
x <- vector(mode="numeric", length=n)
rData <- runif(9)
for(i in 2:n) {
  x[i] <- x[i-1]+rData[i-1]
}

identical(c(0, cumsum(rData)), x)

> identical(c(0, cumsum(rData)), x)
[1] TRUE

答案 2 :(得分:1)

您可以像

一样使用蓝宝石
c(x[1],(sapply(x,function(a){a+runif(1)})[-length(x)]))

答案 3 :(得分:1)

实现这一目标的另一种方法是使用Reduce

f <- function(a, b) a + runif(1)  
x <- Reduce(f, x, accumulate = TRUE)

(只是建议这是一个通用的替代方案;其他答案中的cumsum方式更快)