【问题标题】:R *apply vector as input; matrix as outputR *应用向量作为输入;矩阵作为输出
【发布时间】:2016-02-09 23:51:58
【问题描述】:

我想对向量的每个元素应用一个输出向量的函数。 将该函数应用于该向量的每个元素后,我应该有很多向量,我想rbind 以便有一个矩阵。

代码应该等同于:

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 只是示例。

【问题讨论】:

  • sapply(my_vec,my_function) 能解决您的问题吗?
  • @Heroka 问题是它返回一个列表。
  • 不在你给出的例子中......
  • 哦,你是对的。我明白了...我不明白为什么它不同。我会看明白的。谢谢。
  • @AlbertMasclans 你能更新你的例子来反映你正在使用的现实吗?

标签: r matrix vector apply


【解决方案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)
    

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

    【讨论】:

    • 正如评论所说,在这里使用 sapply,而不是向量或矩阵,它返回一个列表。
    • sapply 不返回列表,而是返回矩阵。 lapply 确实会返回一个列表,该列表可以根据您通过do.call 的请求绑定到矩阵中。你不能有一个向量的向量,但你可以有一个向量列表。
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多