检查其他data.table中data.table值的频率

joh*_*hnl 5 r data.table

 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"))
Run Code Online (Sandbox Code Playgroud)

我想将列添加popularDT2与价值TRUE,每当DT2$group被包含在DT1$group至少两次.所以,在上面的例子中,DT2应该是

    group popular
 1:     A    TRUE
 2:     B    TRUE
 3:     C   FALSE
Run Code Online (Sandbox Code Playgroud)

什么是有效的方法来达到这个目的?

更新的示例: 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"))
Run Code Online (Sandbox Code Playgroud)

并且期望的输出将是

    group popular
 1:     A    TRUE
 2:     B    TRUE
 3:     C   FALSE
 4:     D   FALSE
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 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
Run Code Online (Sandbox Code Playgroud)

data.table连接语法非常强大,因为在加入时,您还可以聚合/选择/更新列j.在这里我们执行连接.对于每个行中DT2$group的相应匹配行DT1,我们计算j-expression .N >= 2L; 通过指定by = .EACHI(请检查1.9.4 NEWS),我们j每次计算-expression.


1.9.4,.()已被引入作为所有的别名i,jby.所以你也可以这样做:

DT1[.(DT2$group), .(popular = .N >= 2L), by = .EACHI]
Run Code Online (Sandbox Code Playgroud)

当您通过单个字符列加入时,可以完全删除.()/ J()syntax(为方便起见).所以这也可以写成:

DT1[DT2$group, .(popular = .N >= 2L), by = .EACHI]
Run Code Online (Sandbox Code Playgroud)