2017-02-10 1 views
0

У меня есть этот небольшой фрагмент кода для преобразования кадра данных с длинного на широкий.Есть ли решение с лучшей производительностью, чем переформатирование от преобразования длинного в широкоформатное?

library(reshape2) 
mydata <- structure(list(issn = c("1980-4814", "1945-3116", "1681-4835", "1367-0751", "1516-6104", "1359-7566", "2319-0795", "1390-6615", "1808-8023", "1746-4269", "1852-2181", "0022-4596", "1808-2386", "0254-6051", "1981-3686", "1077-2618", "1809-3957", "2179-5746", "0147-6513", "1070-5503"), periodico = c("ABCustos (", "Journal of", "The Electr", "Logic Jour", "DIREITO, E", "REGIONAL &", "REVISTA FÓ", "UMBRAL: RE", "Segurança ", "Journal of", "Augm Domus", "Journal of", "BBR. Brazi", "Jinshu Rèc", "Revista Br", "IEEE Indus", "Revista SO", "Biota Amaz", "Ecotoxicol", "Internatio"), qualis = c("B4", "B3", "B2", "B2", "A1", "B5", "B5", "C ", "B5", "B3", "B3", "A1", "B4", "B3", "B5", "A2", "C ", "B3", "A2", "B1"), area = c(1L, 1L, 1L, 2L, 3L, 3L, 3L, 3L, 4L, 5L, 6L, 6L, 7L, 7L, 7L, 8L, 8L, 9L, 9L, 9L)), .Names = c("issn", "periodico", "qualis", "area"), row.names = c(1L, 501L, 1001L, 1501L, 2001L, 2501L, 3001L, 3501L, 4001L, 4501L, 5001L, 5501L, 6001L, 6501L, 7001L, 7501L, 8001L, 8501L, 9001L, 9501L), class = "data.frame") 

reshape(mydata, direction = "wide", 
     idvar = c("issn", "periodico"), 
     timevar = "area") 

Данные enter image description here

и результат является

enter image description here

это нормально, просто я хочу, но как кадр данных растет на высоте свыше 2000 записей становится очень медленным.

У меня есть только 10 областей для сопоставления столбцов, но более 10.000 issn.

Я ищу более быстрые способы достижения такого же результата.

Благодаря

+0

Используйте 'dcast' из' data.table'. Я думаю, что решение 'dcast' уже было в более ранней ссылке на аналогичный вопрос, который вы задали – akrun

+0

@akrun. Решение dcast больше не работало так, как должно было работать, как показано на аналогичной должности в другом месте. Кажется, из-за моих ограничений с английским языком вам что-то непонятно. Ответы, которые я нашел здесь, не решают проблему категориальных/номинальных данных, они сосредоточены на совокупности числовых значений, и это не мое дело. – jcarlos

+0

Не уверен, почему это не работает 'dcast (setDT (mydata), issn + periodico ~ area, value.var =" qualis ")' получает мне аналогичный вывод, как ваш 'reshape' вывод – akrun

ответ

2

по преобразованию задач, dcast из data.table сильно оптимизированная и является очень эффективным и должен быть быстрее, чем любой из пакетов, доступных в настоящее время

library(data.table) 
dcast(setDT(mydata), issn+periodico~area, value.var = "qualis") 
1

Вы можете использовать dplyr и tidyr для этого:

library(dplyr) 
library(tidyr) 
mydata %>% 
    mutate(area = paste('qualis',area,sep=".")) %>% 
    spread(area, qualis) 
Смежные вопросы