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

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

我想加一列popularDT2带值 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 中作为别名引入, jby .所以你也可以这样做:
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/

相关文章:

json - 从 R 中的 json 文件导入数据

r - XTS 的日期有不同的来源。使用 R 计算 beta

R : group by with custom functions

r - 如何使用 R 中的自动过程(即 for 循环等)查找向量之间特定值序列的匹配行

r - 为什么 data.table 取消嵌套时间随着特定数据集的行数平方而增长?

必须提供 R 日期 "origin"

r - 是否可以创建自渲染 Rmarkdown 文档?

r - 一个函数作为参数传递给另一个函数

r - 根据唯一列项的计数创建 3 级指示变量

r - data.table: “group counter” 对于特定的列组合