代码之家  ›  专栏  ›  技术社区  ›  Jordi F. Pagès

如何从sapply函数中获取数据帧?

  •  0
  • Jordi F. Pagès  · 技术社区  · 11 年前

    我正在使用 sapply() 用我自己的函数生成30个随机行走模拟 levy.walk.flights() .

    simmulations=30
    granMAT <- sapply(1:simmulations, function(i){
       a <- levy.walk.flights()[[1]]
       cbind(a,rep(i, length(a[,1])))
    })
    

    对象 a 接收 data.frame 具有2列:x,y;加上在下一行代码中cbinded的ID列。

    这段代码工作得很好,可以生成所有30个模拟。唯一的问题是 蓝宝石() 返回30*3(90)个数组的列表。参见 str(granMAT) 有3个模拟。

    List of 9
    $ : num [1:5748] 0 0.00357 0.0074 0.01071 0.01418 ...
    $ : num [1:5748] 0 0.135 0.28 0.406 0.537 ...
    $ : int [1:5748] 1 1 1 1 1 1 1 1 1 1 ...
    $ : num [1:2434] 0 -0.131 -0.261 -0.385 -0.527 ...
    $ : num [1:2434] 0 -0.048 -0.0955 -0.1412 -0.1933 ...
    $ : int [1:2434] 2 2 2 2 2 2 2 2 2 2 ...
    $ : num [1:2301] 0 -0.0887 -0.1829 -0.276 -0.364 ...
    $ : num [1:2301] 0 0.0941 0.1939 0.2927 0.386 ...
    $ : int [1:2301] 3 3 3 3 3 3 3 3 3 3 ...
    - attr(*, "dim")= int [1:2] 3 3
    - attr(*, "dimnames")=List of 2
    ..$ : chr [1:3] "x" "y" "rep(i, length(a[, 1]))"
    ..$ : NULL`
    

    我想要 蓝宝石() 返回 数据帧 具有3列:x、y、ID。所有数据都位于这3列之下。我试过了 do.call() 还有几个 library(plyr) 函数,但我无法确定哪个函数允许我这样做。

    谢谢你的帮助!

    1 回复  |  直到 11 年前
        1
  •  1
  •   kristang    11 年前
    simmulations=30
    granMAT <- sapply(1:simmulations, function(i){
       a <- levy.walk.flights()[[1]]
       cbind(a,rep(i, length(a[,1])))
    }) %>% rbind_all 
    

    rbind_all 是一个来自dplyr的短手函数,等于do.call(“rbind”,列表)。将您的结果从sapply发送到rbind_all,意味着它将获取列表并将所有行绑定在一起,返回一个data.frame。