首页 文章

R *应用向量作为输入;矩阵作为输出

提问于
浏览
-1

为了拥有一个矩阵,我想'd like to apply over each element of a vector, a function that outputs a vector. After applying the function to each element of that vector, I should have many vectors, which I' .

代码应该等同于以下内容:

my_function <- function(x) x:(x+10)

my_vec <- 1:10
x <- vector()
for(i in seq_along(vec)){
  x <- rbind(x,my_function(my_vec[i]))
}

当然, my_functionmy_vec 就是例子 .

2 回答

  • 1

    这是一个替代方案:

    matrix( unlist(lapply(my_vec,my_function)), length(my_vec), byrow=TRUE )
    

    速度几乎相同:

    library(microbenchmark)
    
    my_function <- function(x) sin(x:(x+10))
    
    for ( n in 1:4 )
    {
      my_vec <- 1:10^n
    
      print(
        microbenchmark( mra68 = matrix( unlist(lapply(my_vec,my_function)), length(my_vec), byrow=TRUE ),
                        stas.g = do.call(rbind, lapply(my_vec, my_function)),
                        times = 1000 )
      )
    
      print("identical?")
      print( identical( matrix( unlist(lapply(my_vec,my_function)), length(my_vec), byrow=TRUE ),
                        do.call(rbind, lapply(my_vec, my_function)) ) )  
    }
    

    .

    Unit: microseconds
       expr    min     lq     mean median      uq     max neval
      mra68 38.496 40.307 68.00539 41.213 110.052 282.148  1000
     stas.g 41.213 42.572 72.86443 43.930 115.939 445.186  1000
    [1] "identical?"
    [1] TRUE
    Unit: microseconds
       expr     min      lq     mean   median       uq      max neval
      mra68 793.002 810.212 850.4857 818.3640 865.2375 7231.669  1000
     stas.g 876.786 894.901 946.8165 906.2235 966.9100 7051.873  1000
    [1] "identical?"
    [1] TRUE
    Unit: milliseconds
       expr      min       lq     mean   median       uq      max neval
      mra68 2.605448 3.028442 5.269003 4.020940 7.807512 14.51225  1000
     stas.g 2.959604 3.390071 5.823661 4.500546 8.800462 92.54977  1000
    [1] "identical?"
    [1] TRUE
    Unit: milliseconds
       expr      min       lq     mean   median       uq      max neval
      mra68 27.29810 30.99387 51.44223 41.20167 79.46185 559.0059  1000
     stas.g 33.63622 37.22420 60.10224 49.07643 92.94333 395.3315  1000
    [1] "identical?"
    [1] TRUE
    >
    
  • 2

    尝试:

    tmp <- lapply(my_vec, my_function)
     do.call(rbind, tmp)
    

    或者像Heroka建议的那样,使用 sapply . 我更喜欢 lapply ,然后以我喜欢的方式绑定我的输出( rbind / cbind )而不是潜在的转置 .

相关问题