座標(0,0)から始まるランダムウォークをシミュレートしています。ループでそれを行うと、うまく機能します:
require(ggplot2)
n <- 1000 #number of walks
# first solution, w/ loop... works but is SLOOOW
coord <- data.frame (x=0, y=0, step=0) #origin
for (i in 1:n){
dir <- sample(c("w", "e", "n", "s"), 1) #random direction
step <- sample(1:4, 1) #how far to go in each walk
startx <- coord[nrow(coord), 1]
starty <- coord[nrow(coord), 2]
endx <- ifelse (dir=="w", startx-step, ifelse(dir=="e", startx+step, startx))
endy <- ifelse (dir=="n", starty+step, ifelse(dir=="s", starty-step, starty))
newcoord <- data.frame (x=endx, y=endy, step=step)
coord <- rbind(coord, newcoord)
}
rw <- ggplot(coord, aes(x=x, y=y))
rw + geom_path() +
ggtitle(paste(n, "walks")) +
geom_point(aes(x=0, y =0), color="green", size=I(5)) +
geom_point(aes(x=endx, y =endy), color="red", size=I(5))
ただし、n>10,000 では非常に遅くなるため、ループを回避して何らかの形式の「適用」を使用したいと考えていますが、行 n と n-1 から座標の値を追加する方法がわかりません。助けてください、ありがとう。
# second solution
d <- data.frame(dir=sample(c("w", "e", "n", "s"), n, replace=T), step=sample(1:4, n, replace=T))
xy <- data.frame(x=0, y=0)
x. <- data.frame(x=with(d, ifelse (dir=="w", -step, ifelse(dir=="e", step, 0))))
y. <- data.frame(y=with(d, ifelse (dir=="s", -step, ifelse(dir=="n", step, 0))))
x.y. <- cbind(x.,y.)
xy <- rbind(xy, x.y.)
head(xy)
# ... stuck here