【问题标题】:Faster alternative than apply for using function utf8ToInt in a matrix比在矩阵中使用函数 utf8ToInt 更快的替代方案
【发布时间】:2018-02-23 01:58:10
【问题描述】:

我有一个尺寸为 9000000x10 的字符串矩阵 (my_data),每个值都是一个字符串。我想使用函数utf8ToInt 将其转换为数值矩阵,但这需要很长时间并且会导致我的会话崩溃。

new_matrix <- apply(my_data, 1:2, "utf8ToInt")

结果是我所期望的,但我需要一种更有效的方法。

非常感谢任何帮助。

想象一下我的数据是:

my_data <- matrix(c("a","b","c","d"), ncol = 2)

但实际上是 9000000x10 而不是 2x2。

【问题讨论】:

  • my_data[] &lt;- utf8ToInt(c(my_data)) 怎么样?
  • 嗨,utf8toInt 不接受向量或矩阵作为输入,这是主要问题,您的代码返回以下错误:警告消息:在 utf8ToInt(c(my_data)) 中:参数应该是字符向量长度为 1 的除第一个元素外的所有元素都将被忽略

标签: r matrix apply


【解决方案1】:

使用vapply 几乎快两倍。由于vapply返回一个向量,所以需要重新建立矩阵格式(这里用structure)。

library(microbenchmark)

my_data <- matrix(sample(letters, 2*100, replace = TRUE), ncol = 2)

microbenchmark(
  apply  = apply(my_data, 1:2, utf8ToInt),
  vapply = structure(vapply(my_data, utf8ToInt, numeric(1)), dim=dim(my_data)),
  times = 500L, check = 'equal'
)
#> Unit: microseconds
#>    expr     min      lq    mean  median       uq      max neval
#>   apply 199.201 208.001 224.811 213.801 220.1515 1560.400   500
#>  vapply 111.000 115.501 136.343 120.401 124.9505 1525.901   500

reprex package (v1.0.0) 于 2021-03-06 创建

【讨论】:

    猜你喜欢
    • 2017-07-10
    • 2014-07-19
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2012-07-05
    相关资源
    最近更新 更多