基于另一个变量的重复值的变量总和

时间:2018-09-05 06:17:42

标签: r data.table

假设我有下表的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

任何帮助将不胜感激!

2 个答案:

答案 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来查看日志。

如果您有任何时间安排,请让我们知道上述哪一个速度更快。我押注第二个。