如何在R中对数据表进行反向排序操作?

dtcbnfnu  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(124)

设DT是一个示例数据表,DT 2是通过对DT中的每一列进行独立排序而构造的。
作为示例,表DT:
| ID|信|
| --|--|
| 1 |B|
| 4 |一|
| 3 |C|
| 2 |D|
| 5 |E|
成为表DT 2:
| ID|信|
| --|--|
| 1 |一|
| 2 |B|
| 3 |C|
| 4 |D|
| 5 |E|
在reordering_dt中,我保存了从DT到DT 2的转换所使用的排序。

# 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和DT 2,我如何再次获得DT?
如果我能做这样的事情,我应该能够进行转换:

recovered_DT <- DT2[, lapply(.SD, function(col) col[order(X)])]


其中X是reordering_dt中的对应列。
但是我不知道如何正确地指定X。

ig9co6j1

ig9co6j11#

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

DT3 <- Map(function(val, ord) val[order(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

gzjq41n4

gzjq41n42#

例如,我认为应该使用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

字符串
但是你应该知道xsorted[order(order(x))]需要xorder信息,这是我在评论中说的“边信息”。
换句话说,* 您永远无法从xsorted恢复xhat(因为您也需要x)。

相关问题