我正在尝试使用data.table
的特殊符号(.N
,.I
,.GRP
)。我挣扎的是.EACHI
。是的,我已经阅读了data.table文档,但我从来没有真正理解它...它有时对我来说很神秘。
为了更好地理解.EACHI
,我查看了涉及它的所有问题。这个让我难过:
Conditional data.table merge with .EACHI
重现这里的重要部分:
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)]
dtSmall <- data.table(ID=c(sapply(LETTERS[1:5], rep, 2, simplify = TRUE)), ValueSmall=ceiling(runif(10, min=0, max=1000)))
为什么这样做:
setorder(dtBig, ValueBig)
dtSmall[dtBig, RankSmall2 := max(i.Rank), by=.EACHI, on=.(ID, ValueSmall >= ValueBig)]
但这不是吗? (这会产生错误:)
dtSmall[dtBig, RankSmall2 := max(i.Rank), by=ID, on=.(ID, ValueSmall >= ValueBig)]
最后,答案提供给我难以理解的问题。有没有办法打破它?我从未在data.table的.SD
部分中看到i
:
setorder(dtBig, ID, ValueBig, Rank)
dtSmall[, r :=
dtBig[.SD, on=.(ID, ValueBig <= ValueSmall), mult="last", x.Rank ]
]
我很感激解释为什么这些工作。更一般的解释(教人钓鱼),所以我知道何时是考虑使用.EACHI
的好时机。