如何根据任意顺序对data.table的行进行排序?

时间:2018-10-02 09:34:49

标签: r sorting data.table

我要对data.table(dat)进行排序:

Rating  el  es
A   21.96   0.15
AA  26.25   0.13
AAA 34.07   0.06
B   0.84    0.07
BB  2.24    0.07
BBB 14.63   0.52
CCC 70.48   0.04

通过申请

dat[order(dat$Rating)]

我得到相同的结果。

是否可以基于列评级的任意顺序获得任意顺序?

类似这样的东西:

Rating  el  es
AAA 34,07   0,06
AA  26,25   0,13
A   21,96   0,15
BBB 14,63   0,52
BB  2,24    0,07
B   0,84    0,07
CCC 70,48   0,04

我尝试过:

dat[order(dat[,1],levels = c("AAA","AA","A","BBB", "BB", "B", "CCC"))]

但是我在表中的顺序与以前相同。

3 个答案:

答案 0 :(得分:2)

您需要先将Rating更改为factor,然后使用order

dat$Rating <- factor(dat$Rating, levels = c("AAA","AA","A","BBB", "BB", "B", "CCC"))

dat[order(dat$Rating), ]
# Rating    el   es
# 3    AAA 34.07 0.06
# 2     AA 26.25 0.13
# 1      A 21.96 0.15
# 6    BBB 14.63 0.52
# 5     BB  2.24 0.07
# 4      B  0.84 0.07
# 7    CCC 70.48 0.04

数据:

tt <- "Rating  el  es
A   21.96   0.15
AA  26.25   0.13
AAA 34.07   0.06
B   0.84    0.07
BB  2.24    0.07
BBB 14.63   0.52
CCC 70.48   0.04"

dat <- read.table(text = tt, header = T)

答案 1 :(得分:1)

这里是一个使用setorder中的data.table的选项,应该确实很快。我首先创建一个分组变量,该变量基于@akrun对您的previous question的回答。

dat[, grp := substr(Rating, 1, 1)]
setorder(dat, grp, -Rating)[]
#   Rating    el   es grp
#1:    AAA 34.07 0.06   A
#2:     AA 26.25 0.13   A
#3:      A 21.96 0.15   A
#4:    BBB 14.63 0.52   B
#5:     BB  2.24 0.07   B
#6:      B  0.84 0.07   B
#7:    CCC 70.48 0.04   C

数据

dat <- data.table::fread(
  "Rating  el  es
  A   21.96   0.15
  AA  26.25   0.13
  AAA 34.07   0.06
  B   0.84    0.07
  BB  2.24    0.07
  BBB 14.63   0.52
  CCC 70.48   0.04"
)

答案 2 :(得分:0)

由于您要求任意顺序,请尝试使用适当的索引:

Behavior