字符串分解

dc3*_*dc3 4 string performance r character matrix

我需要使用R来分解大约7500万个字符串.我需要做一些事情,比如创建一个Term Document矩阵,其中文档中出现的每个单词都成为矩阵中的一列,并且在术语出现的任何地方,矩阵元素被编码为1.

我有:大约7500万个字符串,长度约为0-100个字符; 它们代表一个时间序列,提供有关该时期发生的事件的编码信息.每个代码只有一个字符,对应一个时间段.

我需要:某种矩阵或传达信息的方式,它取消了时间序列,并告诉我每个系列中报告某个代码的次数.

例如:字符串"ABCDEFG-123"将成为矩阵中的一行,其中每个字符将被计算为一次.如果这太难了,0和1的矩阵也会给我一些信息,虽然我宁愿保留尽可能多的信息.

有没有人对如何快速做到这一点有任何想法?有20种可能的代码.

Fra*_*ank 5

例:

my20chars = c(LETTERS[1:10], 0:9)

set.seed(1)
x = replicate(1e4, paste0(sample(c(my20chars,"-"),10, replace=TRUE), collapse=""))
Run Code Online (Sandbox Code Playgroud)

一种方法:

library(data.table)

d = setDT(stack(strsplit(setNames(x,x),"")))
dcast(d[ values %in% my20chars ], ind ~ values, fun = length)
Run Code Online (Sandbox Code Playgroud)

结果:

              ind 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J
    1: ---8EEAD8I 0 0 0 0 0 0 0 0 2 0 1 0 0 1 2 0 0 0 1 0
    2: --33B6E-32 0 0 1 3 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0
    3: --3IFBG8GI 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 2 0 2 0
    4: --4210I8H5 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
    5: --5H4DE9F- 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0
   ---                                                   
 9996: JJFJBJ24AJ 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 5
 9997: JJI-J-0FGB 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 3
 9998: JJJ1B54H63 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 3
 9999: JJJED7A3FI 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 3
10000: JJJIF6GI13 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 2 3
Run Code Online (Sandbox Code Playgroud)

基准测试:

library(microbenchmark)

nstrs  = 1e5
nchars = 10
x = replicate(nstrs, paste0(sample(c(my20chars,"-"), nchars, replace=TRUE), collapse=""))

microbenchmark(
dcast = {
  d = setDT(stack(strsplit(setNames(x,x),"")))
  dcast(d[ values %in% my20chars ], ind ~ values, fun = length, value.var="ind")
},
times = 10)

# Unit: seconds
#   expr      min       lq     mean   median       uq      max neval
#  dcast 3.112633 3.423935 3.480692 3.494176 3.573967 3.741931    10
Run Code Online (Sandbox Code Playgroud)

因此,这还不足以处理OP的7500万字符串,但可能是一个很好的起点.