我的数据框包含以下形式的唯一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小时才能运行。
答案 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
我只是注意到列位置的令人费解的转换。我不明白。