我有以下数据集:
> 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代码!
有什么建议吗?
答案 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"))