如何在R中使用data.table计算组合的次数

40 浏览
0 Comments

如何在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 

0
0 Comments

问题出现的原因是原始的代码没有正确地统计出组合的出现次数。解决方法是使用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(...)

0
0 Comments

在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中计算组合的出现次数"这个问题的原因和解决方法。

0