如何反转R中数据表的排序操作?

问题描述 投票:0回答:2

令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。

r data.table lapply
2个回答
0
投票

当然,我们可以用这个来逆转它:

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

0
投票

我认为你应该使用

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
© www.soinside.com 2019 - 2024. All rights reserved.