如何根据r中的另一个键/ ID列将列切换为行?

时间:2017-12-13 16:44:47

标签: sql r database dataframe pivot-table

我有以下数据集:

> 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个

我们有一个包含两个ID列 ID1 ID2 的表格,其他列在2003年至2017年的特定时间段内注册名为Prov的变量值。

我要做的是转换此表,以便我只有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代码!

有什么建议吗?

1 个答案:

答案 0 :(得分: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"))