假设我有下表的ngram:
require(data.table)
DT<-data.table(
ngram=c("last","right","last year","last night", "right now", "right away"),
Freq=c(6364,5163,988,835,1300,87),
n=c(1,1,2,2,2,2),
w1=c(22,37,22,22,37,37),
w2=c(NA,NA,27,56,10,105),
w3=c(NA,NA,NA,NA,NA,NA),
w4=c(NA,NA,NA,NA,NA,NA)
)
> DT
ngram Freq n w1 w2 w3 w4
1: last 6364 1 22 NA NA NA
2: right 5163 1 37 NA NA NA
3: last year 988 2 22 27 NA NA
4: last night 835 2 22 56 NA NA
5: right now 1300 2 37 10 NA NA
6: right away 87 2 37 105 NA NA
其中n表示ngram的类型(例如1 = unigram,2 = bigram等),w1到w4是每个ngram中单词的整数索引,而Freq是数据中ngram出现的次数。 >
对于每个二元组,我需要对所有具有相同w1的二元组的计数求和。我尝试过
DT[.(2),n1:=sum(tabulate(match(Freq[duplicated(w1)],w1)))]
但这不起作用:
> DT
ngram Freq n w1 w2 w3 w4 n1
1: last 6364 1 22 NA NA NA NA
2: right 5163 1 37 NA NA NA NA
3: last year 988 2 22 27 NA NA 0
4: last night 835 2 22 56 NA NA 0
5: right now 1300 2 37 10 NA NA 0
6: right away 87 2 37 105 NA NA 0
我需要的是
> DT
ngram Freq n w1 w2 w3 w4 n1
1: last 6364 1 22 NA NA NA NA
2: right 5163 1 37 NA NA NA NA
3: last year 988 2 22 27 NA NA 1823
4: last night 835 2 22 56 NA NA 1823
5: right now 1300 2 37 10 NA NA 1387
6: right away 87 2 37 105 NA NA 1387
任何帮助将不胜感激!
答案 0 :(得分:0)
尝试一下:
sumfun <- function(r) c(sum(DT[DT$w1==r[4] & DT$n==2,]$Freq))
DT$n1 <- NA
DT$n1[DT$n == 2] <- apply(DT[DT$n==2, ], 1, sumfun)
> DT
ngram Freq n w1 w2 w3 w4 n1
1: last 6364 1 22 NA NA NA NA
2: right 5163 1 37 NA NA NA NA
3: last year 988 2 22 27 NA NA 1823
4: last night 835 2 22 56 NA NA 1823
5: right now 1300 2 37 10 NA NA 1387
6: right away 87 2 37 105 NA NA 1387
答案 1 :(得分:0)
一种方法是聚合,然后执行更新联接,如下所示:
DT[DT[n==2L, sum(Freq), by=.(n, w1)], n1 := V1, on=.(n, w1)]
或另一种写同一件事的方式:
DT[n==2L, n1 := .SD[.SD[, sum(Freq), by=.(w1)], on=.(w1)]$V1]
GForce已打开,因此它应该足够快。您可以在verbose=TRUE
中使用[.data.table
来查看日志。
如果您有任何时间安排,请让我们知道上述哪一个速度更快。我押注第二个。