2016-09-11 4 views
1

csv ниже - из гораздо более длинной таблицы данных, назовите ее temp. Я хочу отличить его от temp.wide с region_code в качестве столбцов и с вертикальным порядком region_code (SAS, SSA, EUR, ...) как порядок столбцов. Я только заметил, что dcast упорядочивает новые столбцы по алфавиту.r таблица данных dcast порядок новых столбцов

  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")) 

Вот код, который я использовал.

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 

Новые имена столбцов: scenario, EAP, EUR, FSU, LAC, MEN, NAM, SAS, SSA.

Я могу взять правильный заказ от temp, а затем использовать setcolorder, чтобы дать temp.wide правильный порядок столбцов. Но мне было интересно, есть ли способ не иметь новый порядок столбцов в алфавитном порядке.

Кроме того, текст справки для dcast говорит

имен для столбцов, которые отданных генерируются в том же порядке (разделенного знак подчеркивания, _) из (уникальных) значений в каждой колонки упомянутых в формуле RHS.

Если я правильно понимаю это, я не думаю, что он описывает, что на самом деле делает dcast. Но я не понимаю, что означает в скобках фраза (разделенная символом подчеркивания, _).

+0

предоставьте пример воспроизводимости. –

+0

Не могли бы вы рассчитать данные? –

+0

Я могу 'dput' данные, но я не знаю, что делать с результатом файла. – JerryN

ответ

3

с вертикальным порядком region_code (SAS, SSA, EUR, ...) как порядок столбцов

Просто пройти фактор с соответствующими уровнями:

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 

Документация, указанная в OP, звучит правильно для меня; в z ~ x + y - уникальные значения x появляются до уникальных значений y в порядке имен столбцов.

+1

Или 'dcast (temp, scene ~ region_code) [, c (имена (temp) [1], unique (temp $ region_code)), with = FALSE]' – akrun