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"))

我想在popular中至少包含DT2两次时,将TRUE列添加到DT2$group中,并将其值设置为DT1$group。因此,在上面的示例中,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.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的join语法非常强大,因为在加入时,您还可以聚合/选择/更新j中的列。在这里,我们执行联接。对于DT2$group中的每一行,在DT1中相应的匹配行上,我们计算j -expression .N >= 2L;通过指定by = .EACHI(请检查1.9.4 NEWS),我们每次都会计算j -expression。

1.9.4中,已将.()作为别名引入所有ijby中。因此,您也可以这样做:
DT1[.(DT2$group), .(popular = .N >= 2L), by = .EACHI]

当您通过单个字符列加入时,可以完全删除.()/J()语法(为方便起见)。所以这也可以写成:
DT1[DT2$group, .(popular = .N >= 2L), by = .EACHI]

关于r - 检查其他表中数据表的频率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26453288/

10-12 17:45