2017-12-13 12 views
1

Iは、次のデータセットを有する:どのように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

我々は2つのID列を持つテーブルを持っているテーブルをID1ID2と他の列レジスタ私は何をしようとしている私はわずか4列(ID1、ID2、日付(または期間)を持つようにこのテーブルを変換することです。 )および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

これはクールです!以前は関数が溶けているのを見ましたが、うまく理解できませんでした。大いに感謝する ! –

関連する問題