使用mapply提高字符串比较的速度

时间:2014-12-06 01:32:40

标签: r

我的数据框包含以下形式的唯一ngrams:

> head(nGram4, 3)
  Term1 Term2 Term3 Term4 Freq
1   the   end    of   the 3457
2   the  rest    of   the 2974
3    at   the   end    of 2950

> head(nGram3, 3)
   Term1 Term2 Term3  Freq
1    one    of   the 15268
2      a   lot    of 13365
3 thanks   for   the 10709

依此类推,直至nGram1(仅限Term1和Freq)。 Term列是字符,Freq列是整数。

对于每一行,我试图引入低阶nGram表的频率,该表对应于除最后一个术语列之外的所有列。因此,对于nGram3中的第1行,“其中一个”,我需要将nGram2 $ Freq拉到Term1 =“1”且Term2 =“of”的行。如下所示:

nGram2[nGram2$Term1==nGram3$Term1 & nGram2$Term2==nGram3$Term2, "Freq"]

我正在尝试使用mapply为nGram3的每一行执行此操作,如下所示:

mapply(function(xfreq, xterm1, xterm2) 
       nGram2[nGram2$Term1==xterm1 & nGram2$Term2==xterm2,"Freq"], 
       nGram3$Freq, nGram3$Term1, nGram3$Term2)

问题是我在nGram2和nGram3中都有大约750,000行,所以这个过程非常慢。我计时了100行nGram3的小样本,需要7.612秒。

mapply(function(xfreq, xterm1, xterm2) 
       nGram2[nGram2$Term1==xterm1 & nGram2$Term2==xterm2,"Freq"], 
       nGram3$Freq[1:100], nGram3$Term1[1:100], nGram3$Term2[1:100])

按照这个速度,这将花费大约16个小时来完成所有750,000行。我不知道我能做些什么来加快这个速度。有什么想法吗?

======== TLDR =========

nGram2和nGram3是非常大的数据帧。如何加快以下表达式:

mapply(function(xfreq, xterm1, xterm2) 
       nGram2[nGram2$Term1==xterm1 & nGram2$Term2==xterm2,"Freq"], 
       nGram3$Freq, nGram3$Term1, nGram3$Term2)

其中Term1和Term2是类型字符,Freq是类型整数?事实上,它需要大约16小时才能运行。

1 个答案:

答案 0 :(得分:2)

如果您将这些作为字符值列(使用stringsAsFactors = FALSE)读取而不是因素,则可以测试合并操作是否有效(并且确实如此):

nGram4[4,] <-c(nGram3[3,],"fish")
merge(nGram4, nGram3, by=1:3)  # could use all.x=TRUE or all.y=TRUE

#   Term1 Term2 Term3 Term4 Freq.x Freq.y
#1 thanks   for   the 10709   fish  10709

我只是注意到列位置的令人费解的转换。我不明白。