我刚刚开始学习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一起循环,但我不确定如何去做。非常感谢有关如何做到这一点的任何建议。在此先感谢您的指导
答案 0 :(得分:4)
由于您没有另行说明,此答案假定stDte
和edDte
列都属于“日期”类。
在R基础中,您可以使用Map()
创建日期序列,然后使用data.frame
将Name
列与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