2017-12-13 11 views
1

나는 다음과 같은 데이터 세트가 있습니다r의 다른 키/ID 열에 따라 열을 행으로 전환하는 방법?

> head(Dataset) 

    IDCLIENT NUMDOSS PROV_200112 PROV_200212 PROV_200312 .... 

     H44879 0104957   0   0   0 .... 
    Z353025 0105289   0   0   0 .... 
    B416771 0105309   0   0   0 .... 
     B5043 0105366   0   0   0 .... 
    A725471 0105370   0   0   0 .... 
    BE406627 0105371   0   0   0 .... 

이 125 열과 250 개 000 OBS

우리는 두 개의 ID 열이있는 테이블이 테이블을 ID1, ID2 및 다른 열 등록 어떤 변수를 Prov라는 변수를 2003 년에서 2017 년까지 일정 기간에 사용합니다.

내가하려는 것은이 테이블을 변환하여 4 개의 열 (ID1, ID2, Date 또는 period) 및 Prov) 125 대신에. 이런 식으로 뭔가 :

>head(DF) 
    IDClient  IDDossier  Date    Prov  
    B416771  0104957  PROV_200110   5  
    B416771  0104957  PROV_200111   0   
    B416771  0104957  PROV_200112  99 
    B416771  0104957  PROV_200212  1,23   
    H44879   0105289  PROV_200212  36,1 
    Z353025  0105309  PROV_200312  10436,175 
    BE4410   0105366  PROV_200406  10438,9  

그렇게 할 나는 다음과 같은 코드를 시도하지만,이 소요 정말 시간과 또한 R에서 몇 가지 오류/경고 메시지를 가지고 : 정말 찾기 위해 노력

# N= dim(ProvTab)[1]*dim(ProvTab)[2] 
# DF=data.frame(IDClient=rep("",N),IDDossier=rep("",N), 
      # Date=rep("",N), Prov=rep("",N), stringsAsFactors = F) 
DF=NULL 
periodd=as.data.frame(colnames(ProvTab)) 
start.time= Sys.time() # to count running time ! 
for (k in 3:ncol(ProvTab)) 
    { 
    for (j in 1:nrow(ProvTab)) 
     { 
    DF=rbind(DF, 
      data.frame(IDClient=ProvTab[j,1], IDDossier=ProvTab[j,2], 
         Date = periodd[k,1] , Prov=ProvTab[j,k])) 
     } 
    } 

end.time= Sys.time() 
end.time- start.time 

다른 솔루션이지만 실패했습니다.

추 신 : PS 코드 : R 또는 SQL 코드를 환영합니다!

제안 사항?

답변

2

저는 이것이 매우 단순하고 폭이 넓은 변형이라고 생각합니다. reshape2 패키지는 이것에 아주 좋습니다.

require(reshape2) 

DF <- melt(Dataset, id.vars= c("IDCLIENT", "NUMDOSS")) 

names(DF) <- c("IDClient", "IDDossier", "Date", "Prov") 

속도가 느린 경우 data.table 대신 시도하는 것이 더 빠를 수 있습니다.

require(data.table) 
setDT(Dataset) 

DF <- melt(Dataset, id.vars= c("IDCLIENT", "NUMDOSS")) 
+1

멋지다! 전에 함수가 녹아있는 것을 보았지만 잘 이해하지 못했습니다. 정말 고마워 ! –