令DT为示例数据表。 DT2 是通过对每一列独立排序而从 DT 构建的。
以表 DT 为例:
身份证 | 信 |
---|---|
1 | B |
4 | A |
3 | C |
2 | D |
5 | E |
成为表DT2:
身份证 | 信 |
---|---|
1 | A |
2 | B |
3 | C |
4 | D |
5 | E |
在 reordering_dt 中,我保存了用于从 DT 转换为 DT2 的排序。
# The original data table
DT <- data.table(
ID = c(1, 4, 3, 2, 5),
Letter = c("B", "A", "C", "D", "E")
)
# The "sorted" data table
DT2 <- DT[, lapply(.SD, function(col) col[order(col)])]
# storing what orderings we used to get DT2 from DT
reordering_dt <- as.data.table(lapply(DT, order))
仅使用reordering_dt和DT2,如何再次获得DT?
如果我能做这样的事情,我应该能够进行转变:
recovered_DT <- DT2[, lapply(.SD, function(col) col[order(X)])]
X 是 reordering_dt 中的相应列。
但是我不知道如何正确指定X。
当然,我们可以用这个来逆转它:
DT3 <- Map(function(val, ord) val[rank(ord)], DT2, reordering_dt) |>
as.data.table()
DT3
# ID Letter
# <num> <char>
# 1: 1 B
# 2: 4 A
# 3: 3 C
# 4: 2 D
# 5: 5 E
all.equal(DT, DT3)
# [1] TRUE
如果您正在处理非常大的数据集,我建议只做一次
order(.)
,也许
reordering_dt <- as.data.table(lapply(DT, order))
DT2b <- Map(function(val, ord) val[ord], DT, reordering_dt) |>
as.data.table()
all.equal(DT2, DT2b)
# [1] TRUE
我认为你应该使用
order(order(x))
来恢复初始,例如
> set.seed(0)
> (x <- runif(5))
[1] 0.8966972 0.2655087 0.3721239 0.5728534 0.9082078
> (xsorted <- x[order(x)])
[1] 0.2655087 0.3721239 0.5728534 0.8966972 0.9082078
> (xhat <- xsorted[order(order(x))])
[1] 0.8966972 0.2655087 0.3721239 0.5728534 0.9082078
> all.equal(x, xhat)
[1] TRUE