我一直在尝试使用更新的
创建一个“小”数据集,与第一个数据集相似,但有10行(每个 ID 有2个值)。
data.table
条件合并功能,它非常酷。我有这样一种情况,有两个表 dtBig
和 dtSmall
,当进行条件合并时,这两个数据集中都存在多行匹配。是否有一种方法可以使用像 max
或 min
这样的函数对这些多个匹配进行聚合?下面是一个可重现的示例,试图模拟我想要实现的内容。
设置环境
## docker run --rm -ti rocker/r-base
## install.packages("data.table", type = "source",repos = "http://Rdatatable.github.io/data.table")
创建两个虚假数据集
创建一个包含50行的“大”表格(每个ID有10个值)。
library(data.table)
set.seed(1L)
# Simulate some data
dtBig <- data.table(ID=c(sapply(LETTERS[1:5], rep, 10, simplify = TRUE)), ValueBig=ceiling(runif(50, min=0, max=1000)))
dtBig[, Rank := frank(ValueBig, ties.method = "first"), keyby=.(ID)]
ID ValueBig Rank
1: A 266 3
2: A 373 4
3: A 573 5
4: A 909 9
5: A 202 2
---
46: E 790 9
47: E 24 1
48: E 478 2
49: E 733 7
50: E 693 6
创建一个“小”数据集,与第一个数据集相似,但有10行(每个 ID 有2个值)。
dtSmall <- data.table(ID=c(sapply(LETTERS[1:5], rep, 2, simplify = TRUE)), ValueSmall=ceiling(runif(10, min=0, max=1000)))
ID ValueSmall
1: A 478
2: A 862
3: B 439
4: B 245
5: C 71
6: C 100
7: D 317
8: D 519
9: E 663
10: E 407
合并
我接下来想通过ID
执行一次合并,只需要在ValueSmall
大于或等于ValueBig
时进行合并。对于匹配项,我想要获取dtBig
中排名最高的值。我尝试了两种不同的方法,但是只有方法2给出了我想要的输出结果,但我不清楚为什么会有不同的输出结果。似乎它只是返回了最后一个匹配的值。
## Method 1
dtSmall[dtBig, RankSmall := max(i.Rank), by=.EACHI, on=.(ID, ValueSmall >= ValueBig)]
## Method 2
setorder(dtBig, ValueBig)
dtSmall[dtBig, RankSmall2 := max(i.Rank), by=.EACHI, on=.(ID, ValueSmall >= ValueBig)]
结果
ID ValueSmall RankSmall RankSmall2 DesiredRank
1: A 478 1 4 4
2: A 862 1 7 7
3: B 439 3 4 4
4: B 245 1 2 2
5: C 71 1 1 1
6: C 100 1 1 1
7: D 317 1 2 2
8: D 519 3 5 5
9: E 663 2 5 5
10: E 407 1 1 1
在data.table
中,是否有更好的方法从另一个匹配多个值的data.table
中获取最大值?
data.table
github 上存在问题。(github.com/Rdatatable/data.table/issues/733) - Mike.Gahan