gpt4 book ai didi

r - 条件 data.table 与 .EACHI 合并

转载 作者:行者123 更新时间:2023-12-04 11:33:24 26 4
gpt4 key购买 nike

我一直在玩新的 data.table条件合并功能,非常酷。我有两个表的情况,dtBigdtSmall ,并且当发生这种条件合并时,两个数据集中都有多个行匹配。有没有办法使用像 max 这样的函数来聚合这些匹配项?或 min对于这些多场比赛?这是一个可重现的示例,它试图模仿我想要完成的工作。

设置环境

## docker run --rm -ti rocker/r-base
## install.packages("data.table", type = "source",repos = "http://Rdatatable.github.io/data.table")

创建两个假数据集

A 创建一个包含 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 .对于比赛,我想抢 max排名值在 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 中获取最大值的方法有多场比赛?

最佳答案

I next want to perform a merge by ID and needs to merge only where ValueSmall is greater than or equal to ValueBig. For the matches, I want to grab the max ranked value in dtBig.


setorder(dtBig, ID, ValueBig, Rank)
dtSmall[, r :=
dtBig[.SD, on=.(ID, ValueBig <= ValueSmall), mult="last", x.Rank ]
]

ID ValueSmall r
1: A 478 4
2: A 862 7
3: B 439 4
4: B 245 2
5: C 71 1
6: C 100 1
7: D 317 2
8: D 519 5
9: E 663 5
10: E 407 1

我想对 dtBig 进行排序并采用最后一个匹配行而不是通过 .EACHI 计算最大值要快得多,但我并不完全确定。如果您不喜欢排序,只需保存之前的排序顺序,以便之后可以恢复。

Is there a way to aggregate these matches using a function like max or min for these multiple matches?



对于这个更普遍的问题,.EACHI 可以工作,只需确保您为目标表的每一行(在本例中为 dtSmall)执行此操作,所以...
dtSmall[, r :=
dtBig[.SD, on=.(ID, ValueBig <= ValueSmall), max(x.Rank), by=.EACHI ]$V1
]

关于r - 条件 data.table 与 .EACHI 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43174008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com