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

및 결과는, 미세 그냥 내가 원하는,하지만 데이터 프레임이 2.000 기록 이상으로 성장함에 따라 매우 느린 도착

enter image description here

입니다.

열에 매핑되는 영역은 10 개 뿐이지 만 10,000 개 이상은 매핑 할 수 없습니다.

동일한 결과를 얻는 더 빠른 방법을 찾고 있습니다.

감사

재편 문제에 대한
+0

'data.table'의'dcast'를 사용하십시오. 나는'dcast' 솔루션이 이미 비슷한 질문에 링크되어 있다고 생각합니다. – akrun

+0

@akrun dcast 솔루션은 다른 곳에서 유사한 게시물에 나타난 것처럼 작동하지 않아야하는 방식으로 더 이상 작동하지 않습니다. 영어에 대한 나의 한계로 인해 무언가가 당신에게 명확하지 않은 것 같습니다. 여기서 찾은 해답은 범주 형/명목상의 데이터 문제를 해결하지 못하고 수치 값 집계에 중점을두고 있으며 이는 제 경우가 아닙니다. – jcarlos

+0

dcast (setDT (mydata), issn + periodico ~ area, value.var = "qualis")가 작동하지 않는 이유를 모르겠습니다.'reshape' 결과물과 비슷한 출력을 얻습니다. – akrun

답변

2

, data.table에서 dcast는 고도로 최적화 된 매우 효율적이며 당신은이에 대한 dplyrtidyr을 사용할 수 있습니다

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

현재 사용할 수있는 패키지들보다 더 빠르게 처리 될 수있다 :

library(dplyr) 
library(tidyr) 
mydata %>% 
    mutate(area = paste('qualis',area,sep=".")) %>% 
    spread(area, qualis) 
관련 문제