在purrr:map中迭代时,随机值重复

在purrr:map中迭代时,随机值重复,r,random,dplyr,purrr,R,Random,Dplyr,Purrr,我试图生成一个空间有限的随机游动的“伪”数据集,即在每个时间步,个体将随机移动任意距离x和y,但这些值需要约束到我的竞技场(xlim和ylim)——我不特别关心个体碰到边缘时会发生什么(反射或跟随墙壁),但他们不能越过边缘 所有代码都会运行,函数“walker”每次单独运行时都会给出新的和不同的值,但当我将其放入purrr::map时,这些值只会针对每个单独的对象重复 我已经从几个来源拼凑了这个,我相信它可以被大幅简化——最终,我希望n倍要大得多(最终目标是计算访问特定网格广场的个人的时间*#)

我试图生成一个空间有限的随机游动的“伪”数据集,即在每个时间步,个体将随机移动任意距离x和y,但这些值需要约束到我的竞技场(xlim和ylim)——我不特别关心个体碰到边缘时会发生什么(反射或跟随墙壁),但他们不能越过边缘

所有代码都会运行,函数“walker”每次单独运行时都会给出新的和不同的值,但当我将其放入purrr::map时,这些值只会针对每个单独的对象重复

我已经从几个来源拼凑了这个,我相信它可以被大幅简化——最终,我希望n倍要大得多(最终目标是计算访问特定网格广场的个人的时间*#),但第一步是让个人有不同的移动记录

library(tidyverse)
n.times<-10
OUT <-data.frame(x.a = vector("numeric", n.times),y.a = vector("numeric", n.times))

walker <- function(n.times,
                   xlim=c(0,100),
                   ylim=c(0,30),
                   start=c(0,0),
                   stepsize=c(1,1)) {
  ## extract starting point
  x <- start[1]
  y <- start[2]
  for (i in 1:n.times) {
    repeat {
      ## pick jump sizes
      xi <- stepsize[1]*sample(rnorm(n = n.times, mean = 0, sd = .5),1)
      yi <- stepsize[2]*sample(rnorm(n = n.times, mean = 0, sd = .5),1)
      ## new candidate locations
      newx <- x+xi
      newy <- y+yi
      ## IF new locations are within bounds, then
      ##    break out of the repeat{} loop (otherwise
      ##    try again)
      if (newx>xlim[1] && newx<xlim[2] &&
          newy>ylim[1] && newy<ylim[2]) break
    }
    ## set new location to candidate location
    x <- newx
    y <- newy
    OUT[i,"x.a"] <-x
    OUT[i, "y.a"] <-y
  }
  return(OUT)
}


#generate fake fish
fish<-data.frame(fish=as.character(letters[1:10]))

#apply walker to fake fish
fishmoves <- fish %>% 
  mutate(data= map(.,~walker(10))) %>% 
  unnest(data)
库(tidyverse)

n、 times调用map时,它需要遍历与data.frame长度相同的数字。您使用了magrittr
,它将是您的案例中的整个data.frame,使其为1,因此,1值被复制

你可以做两件事:

library(dplyr)
library(tidyr)
library(purrr)

res = tibble(fish) %>% mutate(data=map(fish,~walker(10)))
res$data[1:2]

[[1]]
          x.a       y.a
1  0.05691327 0.6609499
2  0.32432701 1.2174572
3  0.66515689 1.8964721
4  0.88173958 2.3758121
5  0.43781208 3.0526259
6  0.14187217 2.9216027
7  1.04768003 2.6636641
8  0.98632704 2.3824672
9  0.85341917 3.4224993
10 0.97703491 3.9261718

[[2]]
         x.a       y.a
1  0.4137715 0.3202513
2  0.3973849 0.2958951
3  0.9051333 0.4163088
4  0.6249996 0.4514562
5  1.1098010 0.1973155
6  1.1208103 0.6239122
7  1.2693395 1.1020321
8  0.9213216 1.4417686
9  1.0848714 0.5382004
10 0.8635316 0.4516631
这有点不必要,但如果在以后的代码中需要按组执行某些操作,则很有用:

fish %>% group_by(fish) %>% mutate(data=map(.,~walker(10)))

Out/<代码>。p> 我并没有关注第1部分中发生的事情——当我运行它时,我得到了相同的问题,1和2都有相同的数据。像在第2部分中那样添加一个group_by对我很有用,并解决了这个问题。OUT在函数内部,但在for循环外部——如果我将OUT移动到for循环内部,我只会在1declare处获取值,即函数内部的OUT data.frame
walker
这就是我的意思。我已经用名为的库更新了我的答案。也许你有什么冲突。tidyverse在Timesnop可能有点过分,只是一个傻瓜,没有注意到你更换了。与“鱼”。两人现在都在工作。