我有一个id_client日期不同的表。我需要在每个客户端的最大和最小日期之间创建一个所有日期的表。例如,我的表格是:
tbl<-data.frame(id_cliente=c(1,1,1,1,2,3,3,3),
fecha=c('2013-01-01', '2013-06-01','2013-05-01', '2013-04-01',
'2013-01-01', '2013-01-01','2013-05-01','2013-04-01'))
tbl$fecha<-as.Date(as.character(tbl$fecha))
我需要得到一个像:
这样的表格id_cliente fecha
1 01/01/2013
1 01/02/2013
1 01/03/2013
1 01/04/2013
1 01/05/2013
1 01/06/2013
2 01/01/2013
3 01/01/2013
3 01/02/2013
3 01/03/2013
3 01/04/2013
3 01/05/2013
我以为我可以使用ddply(plyr包),所以我创建了一个获得几个月序列的函数:
meses<-function(xMin, xMax){
seq(from=as.Date(xMin, , '%Y-%m-%d'), to=as.Date(xMax, '%Y-%m-%d'), by='month')}
然后我申请ddply:
library(plyr)
vf<-ddply(tbl, .(id_cliente), summarize, maxF=max(fecha), minF=min(fecha),
sec=list(meses(xMin=minF, xMax=maxF)))
但我的表是:
> vf
id_cliente maxF minF sec
1 1 2013-06-01 2013-01-01 15706, 15737, 15765, 15796, 15826, 15857
2 2 2013-01-01 2013-01-01 15706
3 3 2013-05-01 2013-01-01 15706, 15737, 15765, 15796, 15826
存储在列表中的日期将转换为数字。
我知道我可以将数字转换为日期。所以:
convFecha<-function(x){as.Date(x, origin='1970-01-01')}
然后我使用了lapply:
lapply(vf$sec, convFecha)
我得到了理想的结果:
[[1]]
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01"
[[2]]
[1] "2013-01-01"
[[3]]
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01"
此时我不知道如何创建决赛桌。如果我尝试将此结果粘贴到我的表格中,它会再次以数字转换日期。
vf$sec1<-lapply(vf$sec, convFecha)
那么,我是否必须将这些日期粘贴到vf的每一行?有没有其他方式你得到理想的表?到达桌子的下一步是什么?
答案 0 :(得分:1)
这不是一个完整的答案,而是使用by
函数
out <- by(tbl, list(tbl$id_cliente),
function(x) seq(from=as.Date(min(x$fecha), , '%Y-%m-%d'),
to=as.Date(max(x$fecha), '%Y-%m-%d'), by='month'))
> out
: 1
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01"
[6] "2013-06-01"
-------------------------------------------------------
: 2
[1] "2013-01-01"
-------------------------------------------------------
: 3
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01"
答案 1 :(得分:0)
这是我的尝试,
tbl <- data.frame(id_cliente = c(1, 1, 1, 1, 2, 3, 3, 3),
fecha = c('2013-01-01', '2013-06-01', '2013-05-01', '2013-04-01',
'2013-01-01', '2013-01-01', '2013-05-01', '2013-04-01'))
ddply(tbl, .(id_cliente), function(d) {
xMin <- min(as.Date(d$fecha))
xMax <- max(as.Date(d$fecha))
data.frame(fecha = format(seq(from=xMin, to=xMax, by='month'), format = "%d/%m/%Y"))
})
输出:
id_cliente fecha
1 1 01/01/2013
2 1 01/02/2013
3 1 01/03/2013
4 1 01/04/2013
5 1 01/05/2013
6 1 01/06/2013
7 2 01/01/2013
8 3 01/01/2013
9 3 01/02/2013
10 3 01/03/2013
11 3 01/04/2013
12 3 01/05/2013