在R中的数据框中生成两个日期之间的行
我刚刚开始学习R一段时间。我有下表在R中的数据框中生成两个日期之间的行,r,data.table,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
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”循环for与rbind的组合,但我不确定如何进行。如果您能就如何做到这一点提出建议,我们将不胜感激。提前感谢您的指导,因为您没有另外说明,此回答假设
stDte
和edDte
列都是“日期”类
在base R中,您可以使用Map()
创建日期序列,然后使用rep.int()
创建新的Name
列后,使用rep.int()将新的数据框组合在一起
您可以为每一行构建一系列数据帧,然后将它们绑定在一起。dataframe函数的参数循环属性将根据需要多次重复“名称”的值:
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") ) } ))
欢迎来到SO。你试过什么吗?是的,Richard Scriven的data.table方法正是我所需要的。我没有想到使用seq(stDte,edDte,by='month')、by='Name']向表中添加新行,因为我以前只使用它来聚合行。这是一个反应极快的论坛。我将在这里学到很多东西。
library(data.table)
setDT(df)[, .(Dte = seq(stDte, edDte, by = "month")), by = Name]
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") ) } ))
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