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语法非常强大,在join的同时,你还可以聚合/选择/更新j
中的列。 .在这里我们执行一个连接。对于 DT2$group
中的每一行, 在 DT1
中对应的匹配行上,我们计算 j
-表达式.N >= 2L
;通过指定 by = .EACHI
(请检查 1.9.4 NEWS ),我们计算 j
- 每次表达。在
1.9.4
, .()
已在所有 i
中作为别名引入, j
和 by
.所以你也可以这样做:DT1[.(DT2$group), .(popular = .N >= 2L), by = .EACHI]
当您通过单个字符列加入时,您可以删除
.()
/J()
完全语法(为方便起见)。所以这也可以写成:DT1[DT2$group, .(popular = .N >= 2L), by = .EACHI]
关于r - 检查其他 data.table 中 data.table 值的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453288/