我有这个数据集:
library(data.table)
dt <- data.table(
record=c(1:20),
area=rep(LETTERS[1:4], c(4, 6, 3, 7)),
score=c(1,1:3,2:3,1,1,1,2,2,1,2,1,1,1,1,1:3),
cluster=c("X", "Y", "Z")[c(1,1:3,3,2,1,1:3,1,1:3,3,3,3,1:3)]
)
我已经使用这篇文章中的解决方案来创建此摘要:
dt_summary =
dt[ , .N, keyby = .(area, score, cluster)
][ , {
idx = frank(-N, ties.method = 'min') == 1
NN = sum(N)
.(
cluster_mode = cluster[idx],
cluster_pct = 100*N[idx]/NN,
cluster_freq = N[idx],
record_freq = NN
)
}, by = .(area, score)]
dt_score_1 <- dt_summary[score == 1]
setnames(dt_score_1, "area", "zone")
我想使用
dt_score_1
的结果根据 area/zone 和 cluster/cluster_mode 过滤 dt
。因此,在一个新的 data.table 中,区域 A 从 dt
中提取的唯一行应该属于集群 X,对于区域 D,它们应该是集群 Z 等。 最佳答案
如果我正确理解了这个问题,这是 dt
与 dt_score_1
的合并,条件为 area = zone, cluster = cluster_mode
。
dt[dt_score_1, on = .(area = zone, cluster = cluster_mode)]
# record area score cluster i.score cluster_pct cluster_freq record_freq
# 1: 1 A 1 X 1 100.00000 2 2
# 2: 2 A 1 X 1 100.00000 2 2
# 3: 7 B 1 X 1 66.66667 2 3
# 4: 8 B 1 X 1 66.66667 2 3
# 5: 11 C 2 X 1 100.00000 1 1
# 6: 12 C 1 X 1 100.00000 1 1
# 7: 14 D 1 Z 1 80.00000 4 5
# 8: 15 D 1 Z 1 80.00000 4 5
# 9: 16 D 1 Z 1 80.00000 4 5
# 10: 17 D 1 Z 1 80.00000 4 5
# 11: 20 D 3 Z 1 80.00000 4 5
有关 join-as-filter 的更详细说明,请参阅@Frank 发布的以下链接
Perform a semi-join with data.table
关于r - 使用不同列名的另一个 data.table 过滤 data.table,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52818659/