R在数据表中更改行顺序

时间:2016-09-09 15:42:19

标签: r data.table

我想根据列元素列表更改行顺序。以下是此类列表的示例:

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中的位置?

2 个答案:

答案 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]