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
中,已将.()
作为别名引入所有i
,j
和by
中。因此,您也可以这样做: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/