2016-09-11 5 views
1

Die CSV unten ist von einer viel längeren Datentabelle, nennen Sie es temp. Ich möchte es auf temp.wide mit region_code als Spalten und mit der vertikalen Reihenfolge region_code (SAS, SSA, EUR, ...) als die Reihenfolge der Spalten zu werfen. Mir ist gerade aufgefallen, dass dcast die neuen Spalten alphabetisch sortiert.r Datentabelle dcast Reihenfolge der neuen Spalten

  scenario region_code     region_name value 
1:   2010   SAS     South Asia 61.17716 
2:   2010   SSA Africa south of the Sahara 62.08588 
3:   2010   EUR      Europe 63.76123 
4:   2010   LAC Latin America and Caribbean 68.84806 
5:   2010   FSU   Former Soviet Union 59.04499 
6:   2010   EAP  East Asia and Pacific 64.00579 
7:   2010   NAM    North America 66.18235 
8:   2010   MEN Middle East and North Africa 58.03167 
9: SSP2-NoCC-REF   SAS     South Asia 57.29973 
10: SSP2-NoCC-REF   SSA Africa south of the Sahara 65.14987 
11: SSP2-NoCC-REF   EUR      Europe 63.99204 
12: SSP2-NoCC-REF   LAC Latin America and Caribbean 68.21118 
13: SSP2-NoCC-REF   FSU   Former Soviet Union 60.10807 
14: SSP2-NoCC-REF   EAP  East Asia and Pacific 63.86103 
15: SSP2-NoCC-REF   NAM    North America 65.97859 
16: SSP2-NoCC-REF   MEN Middle East and North Africa 58.98356 

temp = setDT(structure(list(scenario = c("2010", "2010", "2010", "2010", "2010", 
"2010", "2010", "2010", "SSP2-NoCC-REF", "SSP2-NoCC-REF", "SSP2-NoCC-REF", 
"SSP2-NoCC-REF", "SSP2-NoCC-REF", "SSP2-NoCC-REF", "SSP2-NoCC-REF", 
"SSP2-NoCC-REF"), region_code = c("SAS", "SSA", "EUR", "LAC", 
"FSU", "EAP", "NAM", "MEN", "SAS", "SSA", "EUR", "LAC", "FSU", 
"EAP", "NAM", "MEN"), region_name = c("South Asia", "Africa south of the Sahara", 
"Europe", "Latin America and Caribbean", "Former Soviet Union", 
"East Asia and Pacific", "North America", "Middle East and North Africa", 
"South Asia", "Africa south of the Sahara", "Europe", "Latin America and Caribbean", 
"Former Soviet Union", "East Asia and Pacific", "North America", 
"Middle East and North Africa"), value = c(61.1771623260257, 
62.0858809906661, 63.7612306428217, 68.84805628195, 59.0449875464304, 
64.0057851485101, 66.182351351389, 58.0316719859857, 57.299725759211, 
65.1498720847705, 63.9920412193261, 68.2111842947542, 60.1080745513644, 
63.86103368494, 65.9785850777114, 58.9835574681585)), .Names = c("scenario", 
"region_code", "region_name", "value"), row.names = c(NA, -16L 
), class = "data.frame")) 

Hier ist der Code, den ich verwendet habe.

formula.wide <- "scenario ~ region_code" 
    temp.wide <- data.table::dcast(
    data = temp, 
    formula = formula.wide, 
    value.var = "value") 


     scenario  EAP  EUR  FSU  LAC  MEN  NAM  SAS  SSA 
1:   2010 64.00579 63.76123 59.04499 68.84806 58.03167 66.18235 61.17716 62.08588 
2: SSP2-NoCC-REF 63.86103 63.99204 60.10807 68.21118 58.98356 65.97859 57.29973 65.14987 

Die neuen Spaltennamen sind scenario, EAP, EUR, FSU, LAC, MEN, NAM, SAS, SSA.

Ich kann die richtige Reihenfolge von temp nehmen und dann setcolorder verwenden, um temp.wide die richtige Spaltenreihenfolge zu geben. Aber ich habe mich gefragt, ob es eine Möglichkeit gibt, die neue Spaltenreihenfolge nicht alphabetisch zu sortieren.

Auch sagt der Hilfetext für dcast

Namen für Spalten, die in der gleichen Reihenfolge erzeugt gegossen werden (durch einen Unterstrich getrennt, _) aus den (eindeutigen) Werten in jeder Spalte in der Formel RHS erwähnt.

Wenn ich das richtig verstehe, denke ich nicht, dass es beschreibt, was dcast tatsächlich macht. Aber ich verstehe nicht, was der Klammerausdruck (durch einen Unterstrich _ getrennt) bedeutet.

+0

bitte ein reproduzierbares Beispiel angeben. –

+0

Könnten Sie bitte die Daten "dput" geben? –

+0

Ich kann die Daten "dput", aber ich weiß nicht, was ich mit der resultierenden Datei machen soll. – JerryN

Antwort

3

mit der vertikalen Ordnung des region_code (SAS, SSA, EUR, ...) als die Reihenfolge der Spalten

einfach einen Faktor mit entsprechenden Ebenen passieren:

dcast(temp, scenario ~ factor(region_code, levels=unique(region_code))) 

     scenario  SAS  SSA  EUR  LAC  FSU  EAP  NAM  MEN 
1:   2010 61.17716 62.08588 63.76123 68.84806 59.04499 64.00579 66.18235 58.03167 
2: SSP2-NoCC-REF 57.29973 65.14987 63.99204 68.21118 60.10807 63.86103 65.97859 58.98356 

Die im OP zitierte Dokumentation klingt für mich korrekt; in z ~ x + y - Die eindeutigen Werte von x kommen vor den eindeutigen Werten von y in der Reihenfolge der resultierenden Spaltennamen.

+1

Oder'cast (Temp, Szenario ~ Region_Code) [, c (Namen (Temp) [1], Unique (Temp $ Region_Code)), mit = FALSE] ' – akrun

Verwandte Themen