如何在R中使用data.table计算组合的次数
如何在R中使用data.table计算组合的次数
我有两个data.tables。我想要计算在另一个表中与表中某个组合匹配的行数。我查阅了data.table的文档,但没有找到答案。我使用的是data.table 1.9.2版本。
现在我想要计算DT2中(3, 8)和(2, 3)这两个组合的数量。
DT1 <- data.table(a=c(3,2), b=c(8,3)) DT2 <- data.table(w=c(3,3,3,2,3), x=c(8,8,8,3,7), z=c(2,6,7,2,2)) DT1 # a b # 1: 3 8 # 2: 2 3 DT2 # w x z # 1: 3 8 2 # 2: 3 8 6 # 3: 3 8 7 # 4: 2 3 2 # 5: 3 7 2 setkey(DT2, w, x) nrow(DT2[J(3, 8), nomatch=0]) # [1] 3 ## 正确! nrow(DT2[J(2, 3), nomatch=0]) # [1] 1 ## 正确! DT1[,count_combination_in_dt2 := nrow(DT2[J(a, b), nomatch=0])] DT1 # a b count_combination_in_dt2 # 1: 3 8 4 ## 不对 # 2: 2 3 4 ## 不对
预期结果:
# a b count_combination_in_dt2 # 1: 3 8 3 # 2: 2 3 1
问题出现的原因是原始的代码没有正确地统计出组合的出现次数。解决方法是使用by=list(a,b)
将数据表按照a和b两列进行分组,并在每个分组内计算出现次数。以下是更新后的代码和结果:
DT1[,count_combination_in_dt2:=nrow(DT2[J(a,b),nomatch=0]), by=list(a,b)] DT1 ## ## a b count_combination_in_dt2 ## 1: 3 8 3 ## 2: 2 3 1
编辑:一些更多的细节:在原始版本中,您使用了DT2[DT1, nomatch=0]
(因为您使用了所有的a,b组合)。如果您想要为每个a,b组合分别使用J(a,b)
,则需要使用by
参数。数据表将按a和b两列进行分组,并在每个分组内计算nrow(...)
。
在R中使用data.table库对数据进行分组计数时,有一个特定的问题是如何计算组合的出现次数。下面的代码展示了如何解决这个问题:
setkey(DT2, w, x) DT2[DT1, .N, by = .EACHI] # w x N #1: 3 8 3 #2: 2 3 1 # In versions <= 1.9.2, use DT2[DT1, .N] instead
上面的代码对数据表DT1和DT2进行了合并,并通过`.N`函数计算了每个组合的行数。通过`by = .EACHI`参数定义了组合的分组方式。
感谢!是否可以将结果列赋值给DT1?我尝试过`DT2[DT1, count_combination_in_dt2:=.N]`,但它不起作用。
下面的代码展示了如何在DT1中赋值结果列,并且相比第一种解决方案速度更快:
DT1[,count:=DT2[DT1, .N][,N]]
以上就是解决"如何在R的data.table中计算组合的出现次数"这个问题的原因和解决方法。