根据数据表中的因子列对每组的行重新排序

Har*_*pta 1 sorting r data.table

我有data.table这样的

ds <- data.table(ID = c(1,1,1,1,1,2,2,2,2,2),
                 Month = c("Jan", "Feb", "Mar", "Apr", "May", "Jan", "Feb", "Mar", "Apr", "May"),
                 val = c(1,2,3,4,5,6,7,8,9,10))

ds
   ID Month val
1:  1   Jan   1
2:  1   Feb   2
3:  1   Mar   3
4:  1   Apr   4
5:  1   May   5
6:  2   Jan   6
7:  2   Feb   7
8:  2   Mar   8
9:  2   Apr   9
10:  2   May  10
Run Code Online (Sandbox Code Playgroud)

我想让我data.table在每个ID组中的位置重新Month排列这样的顺序

    ID Month val
4:   1   Apr   4
5:   1   May   5
1:   1   Jan   1
2:   1   Feb   2
3:   1   Mar   3
9:   2   Apr   9
10:  2   May  10
6:   2   Jan   6
7:   2   Feb   7
8:   2   Mar   8
Run Code Online (Sandbox Code Playgroud)

我希望每个组的月份顺序为 Apr, May, Jan, Feb, Mar

我该如何实现?

akr*_*run 5

我们可以用orderi通过将“月”,以factorlevels自定义命令指明

ds[order(factor(Month, levels = c("Apr", "May", "Jan", "Feb", "Mar"))), .SD,ID]
#    ID Month val
# 1:  1   Apr   4
# 2:  1   May   5
# 3:  1   Jan   1
# 4:  1   Feb   2
# 5:  1   Mar   3
# 6:  2   Apr   9
# 7:  2   May  10
# 8:  2   Jan   6
# 9:  2   Feb   7
#10:  2   Mar   8
Run Code Online (Sandbox Code Playgroud)

或者另一个选择是 match

ds[order(match(Month, c("Apr", "May", "Jan", "Feb", "Mar"))), .SD,ID]
Run Code Online (Sandbox Code Playgroud)

除了一一指定,我们还可以利用month.abbie month.abb[c(4:5, 1:3)]代替c("Apr", "May", "Jan", "Feb", "Mar")