在另一个data.table中检查data.table值的频率

5
 library(data.table)
 DT1 <- data.table(num = 1:6, group = c("A", "B", "B", "B", "A", "C"))
 DT2 <- data.table(group = c("A", "B", "C"))

我想要添加一列popularDT2中,并且当DT2$group至少出现两次在DT1$group中时,其值为TRUE。因此,在上面的例子中,DT2应该是

    group popular
 1:     A    TRUE
 2:     B    TRUE
 3:     C   FALSE

有什么高效的方法可以实现这个目标?

更新的示例: DT2 可能包含比 DT1 更多的组,因此这是一个更新的示例:

 DT1 <- data.table(num = 1:6, group = c("A", "B", "B", "B", "A", "C"))
 DT2 <- data.table(group = c("A", "B", "C", "D"))

期望的输出结果应该是:

    group popular
 1:     A    TRUE
 2:     B    TRUE
 3:     C   FALSE
 4:     D   FALSE

1
DT2 是否始终具有与 DT1 相同的唯一 group?如果是,则简单地使用 DT1[, .(popular = .N >= 2L), by=group] - Arun
嗨@Arun,不,它并没有;我在这里过于简化了例子,抱歉。如果“DT2”包含的组比“DT1”多,则popular应为“FALSE”(因为它至少没有在“DT1$group”中出现两次)。 - johnl
对于一个好问题,给出+1 - Rich Scriven
这里有一种非数据表的方法!table(factor(DT1$group, levels = unique(DT2$group))) >= 2 - rawr
2个回答

10

我会这样做:

## 1.9.4+
setkey(DT1, group)
DT1[J(DT2$group), list(popular = .N >= 2L), by = .EACHI]
#    group popular
# 1:     A    TRUE
# 2:     B    TRUE
# 3:     C   FALSE
# 4:     D   FALSE ## on the updated example

data.table的连接语法非常强大,因为在连接时,您还可以在j中聚合/选择/更新列。这里我们执行一个连接操作,对于DT2$group中的每一行,在DT1中相应匹配的行上,计算j表达式.N >= 2L;通过指定by = .EACHI(请参见1.9.4 NEWS),我们每次都会计算j表达式。


1.9.4中,.()已作为所有ijby的别名引入。因此,您也可以这样做:

DT1[.(DT2$group), .(popular = .N >= 2L), by = .EACHI]

当您仅通过单个字符列进行连接时,您可以完全省略.() / J() 语法(方便起见)。因此,这也可以写成:

当你只通过一个字符列加入时,你可以完全省略.() / J() 语法(为了方便)。所以这也可以写成:

DT1[DT2$group, .(popular = .N >= 2L), by = .EACHI]

1
专业数据表格 - Rich Scriven
这真是纯粹的魔法。你必须为未来的读者添加一些信息。 - David Arenburg
1
再投一票,今晚你就能获得 data.table 的金徽章了 :) - David Arenburg

3
这是我的做法:首先计算每个组在DT1中出现的次数,然后简单地连接DT2DT1
require(data.table)
DT1 <- data.table(num = 1:6, group = c("A", "B", "B", "B", "A", "C"))
DT2 <- data.table(group = c("A", "B", "C"))

#solution:
DT1[,num_counts:=.N,by=group] #the number of entries in this group, just count the other column
setkey(DT1, group)
setkey(DT2, group)
DT2 = DT1[DT2,mult="last"][,list(group, popular = (num_counts >= 2))]

#> DT2
#   group popular
#1:     A    TRUE
#2:     B    TRUE
#3:     C   FALSE

这可以通过聚合DT1而不是更新它来进一步简化。 - Arun
我认为更新更有效率:聚合需要复制,而更新不需要任何复制。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接