我想根据列元素列表更改行顺序。以下是此类列表的示例:
scenario region_code value
SSP1-NoCC-REF lowInc 0.079897553
SSP2-GFDL-REF lowInc 0.119297969
SSP2-HGEM-REF lowInc 0.124730614
SSP2-IPSL-REF lowInc 0.121280208
SSP2-MIROC-REF lowInc 0.121459249
2010 lowInc 0.316646263
SSP2-NoCC-REF lowInc 0.115680977
SSP3-NoCC-REF lowInc 0.167769763
SSP1-NoCC-REF upMidInc 0.020520457
SSP2-GFDL-REF upMidInc 0.024871731
SSP2-HGEM-REF upMidInc 0.026223688
SSP2-IPSL-REF upMidInc 0.025594828
SSP2-MIROC-REF upMidInc 0.025523934
2010 upMidInc 0.063808085
SSP2-NoCC-REF upMidInc 0.023987357
SSP3-NoCC-REF upMidInc 0.027964746
SSP1-NoCC-REF highInc 0.014672749
SSP2-GFDL-REF highInc 0.015258928
SSP2-HGEM-REF highInc 0.016021142
SSP2-IPSL-REF highInc 0.015681295
SSP2-MIROC-REF highInc 0.015602455
2010 highInc 0.020245181
SSP2-NoCC-REF highInc 0.014812163
SSP3-NoCC-REF highInc 0.014574464
SSP1-NoCC-REF lowMidInc 0.033036779
SSP2-GFDL-REF lowMidInc 0.041298546
SSP2-HGEM-REF lowMidInc 0.043529098
SSP2-IPSL-REF lowMidInc 0.042395484
SSP2-MIROC-REF lowMidInc 0.042263571
2010 lowMidInc 0.092290532
SSP2-NoCC-REF lowMidInc 0.0395448
SSP3-NoCC-REF lowMidInc 0.04952689
这是我正在使用的数据表的输出:
DT[, scenarioOrder := which(scenario == scenChoice)]
我认为以下代码会创建一个新列scenarioOrder,其值介于1和6之间,具体取决于我可以在其上订购数据表的场景值的位置。
which(scenario == scenChoice)
如果我在数据表外部运行currentJobLoads
,它将返回一个介于1和6之间的整数。但是在数据表中,它会创建一个新列,其中包含特定于某些特定事件之一的行号值场景。
如何创建scenarioOrder列,其中的条目介于1和6之间,具体取决于行值在scenChoice中的位置?
答案 0 :(得分:6)
您可以使用match
来实现此目标:
DT[, scenarioOrder := match(scenario, scenChoice)]
给出:
scenario region_code value scenarioOrder
1: SSP1-NoCC-REF lowInc 0.07989755 3
2: SSP2-GFDL-REF lowInc 0.11929797 5
3: SSP2-HGEM-REF lowInc 0.12473061 7
4: SSP2-IPSL-REF lowInc 0.12128021 6
5: SSP2-MIROC-REF lowInc 0.12145925 NA
6: 2010 lowInc 0.31664626 NA
7: SSP2-NoCC-REF lowInc 0.11568098 2
8: SSP3-NoCC-REF lowInc 0.16776976 4
9: SSP1-NoCC-REF upMidInc 0.02052046 3
10: SSP2-GFDL-REF upMidInc 0.02487173 5
11: SSP2-HGEM-REF upMidInc 0.02622369 7
12: SSP2-IPSL-REF upMidInc 0.02559483 6
13: SSP2-MIROC-REF upMidInc 0.02552393 NA
14: 2010 upMidInc 0.06380809 NA
15: SSP2-NoCC-REF upMidInc 0.02398736 2
16: SSP3-NoCC-REF upMidInc 0.02796475 4
17: SSP1-NoCC-REF highInc 0.01467275 3
18: SSP2-GFDL-REF highInc 0.01525893 5
19: SSP2-HGEM-REF highInc 0.01602114 7
20: SSP2-IPSL-REF highInc 0.01568130 6
21: SSP2-MIROC-REF highInc 0.01560245 NA
22: 2010 highInc 0.02024518 NA
23: SSP2-NoCC-REF highInc 0.01481216 2
24: SSP3-NoCC-REF highInc 0.01457446 4
25: SSP1-NoCC-REF lowMidInc 0.03303678 3
26: SSP2-GFDL-REF lowMidInc 0.04129855 5
27: SSP2-HGEM-REF lowMidInc 0.04352910 7
28: SSP2-IPSL-REF lowMidInc 0.04239548 6
29: SSP2-MIROC-REF lowMidInc 0.04226357 NA
30: 2010 lowMidInc 0.09229053 NA
31: SSP2-NoCC-REF lowMidInc 0.03954480 2
32: SSP3-NoCC-REF lowMidInc 0.04952689 4
注意:senChoice
的第一个元素是X2010
。如果您希望在该元素上进行匹配,则可能需要将其更改为2010
。
答案 1 :(得分:2)
我会创建另一个包含场景及其顺序的data.table,然后我将data.table与第一个合并。
DT[.(scenario = scenChoice, id = seq_along(scenChoice)), on = 'scenario',
scenarioOrder := id]