在两个日期之间生成行到R中的数据框

时间:2015-01-24 05:47:01

标签: r data.table

我刚刚开始学习R很短的时间。我有下表

Name      stDte      edDte  
A    2010-05-01 2014-12-01  
B    2013-06-01 2014-02-01  

我需要把它变成像这样的表

Name   Dte
A      2010-05-01
A      2010-06-01
A      2010-07-01
...
A      2014-12-01
B      2013-06-01
B      2013-07-01
...
B      2014-02-01

我正在考虑使用' for'的组合。与rbind一起循环,但我不确定如何去做。非常感谢有关如何做到这一点的任何建议。在此先感谢您的指导

3 个答案:

答案 0 :(得分:4)

由于您没有另行说明,此答案假定stDteedDte列都属于“日期”类。

在R基础中,您可以使用Map()创建日期序列,然后使用data.frameName列与rep.int()创建新的数据框。

M <- Map(seq, df$stDte, df$edDte, by = "month")
df2 <- data.frame(
    Name = rep.int(df$Name, vapply(M, length, 1L)), 
    Dte = do.call(c, M)
)    
str(df2)
# 'data.frame':    65 obs. of  2 variables:
#  $ Name: Factor w/ 2 levels "A","B": 1 1 1 1 1 1 1 1 1 1 ...
#  $ Dte : Date, format: "2010-05-01" "2010-06-01" ...
head(df2, 3)
#   Name        Dte
# 1    A 2010-05-01
# 2    A 2010-06-01
# 3    A 2010-07-01
tail(df2, 3)
#    Name        Dte
# 63    B 2013-12-01
# 64    B 2014-01-01
# 65    B 2014-02-01

或者您可以使用data.table包并执行

library(data.table)
setDT(df)[, .(Dte = seq(stDte, edDte, by = "month")), by = Name]

答案 1 :(得分:2)

您可以为每一行构建一系列数据帧,然后将它们组合在一起。 dataframe函数的参数recycle属性将根据需要多次重复“Names”的值:

do.call(rbind, 
        lapply(seq(nrow(dat)), function(x){
            data.frame(Name=dat[x,"Name"], 
            Dte=seq(as.Date(dat[x,"stDte"]), 
                    as.Date(dat[x,"edDte"]) ,by="month") ) } ))

答案 2 :(得分:2)

library(plyr)
ddply(df, .(Name), summarise, Dte = seq(as.Date(stDte), as.Date(edDte), by = "month"))
   Name        Dte
1     A 2010-05-01
2     A 2010-06-01
3     A 2010-07-01
4     A 2010-08-01
5     A 2010-09-01
6     A 2010-10-01
7     A 2010-11-01
8     A 2010-12-01
9     A 2011-01-01
10    A 2011-02-01
11    A 2011-03-01
12    A 2011-04-01
13    A 2011-05-01
14    A 2011-06-01
15    A 2011-07-01
16    A 2011-08-01
17    A 2011-09-01
18    A 2011-10-01
19    A 2011-11-01
20    A 2011-12-01
21    A 2012-01-01
22    A 2012-02-01
23    A 2012-03-01
24    A 2012-04-01
25    A 2012-05-01
26    A 2012-06-01
27    A 2012-07-01
28    A 2012-08-01
29    A 2012-09-01
30    A 2012-10-01
31    A 2012-11-01
32    A 2012-12-01
33    A 2013-01-01
34    A 2013-02-01
35    A 2013-03-01
36    A 2013-04-01
37    A 2013-05-01
38    A 2013-06-01
39    A 2013-07-01
40    A 2013-08-01
41    A 2013-09-01
42    A 2013-10-01
43    A 2013-11-01
44    A 2013-12-01
45    A 2014-01-01
46    A 2014-02-01
47    A 2014-03-01
48    A 2014-04-01
49    A 2014-05-01
50    A 2014-06-01
51    A 2014-07-01
52    A 2014-08-01
53    A 2014-09-01
54    A 2014-10-01
55    A 2014-11-01
56    A 2014-12-01
57    B 2013-06-01
58    B 2013-07-01
59    B 2013-08-01
60    B 2013-09-01
61    B 2013-10-01
62    B 2013-11-01
63    B 2013-12-01
64    B 2014-01-01
65    B 2014-02-01