我每半年有一组数据,每六个月有一个名字。如何使用原始数据框中的半年名称创建每月时间序列?
为清楚起见,我正在尝试创建此文件:
Date V1 V2 --> Date V1 V2
Jan-2012 Name1 Name2 --> Jan-2012 Name1 Name2
Jul-2012 Name3 Name4 --> Feb-2012 Name1 Name2
Jan-2013 Name5 Name6 --> Mar-2012 Name1 Name2
Apr-2012 Name1 Name2
May-2012 Name1 Name2
Jun-2012 Name1 Name2
Jul-2012 Name3 Name4
etc...
任何帮助将不胜感激!
答案 0 :(得分:1)
此方法使用tidyverse
。首先,这是一个虚拟数据帧,每6个月有数据。
df <- data.frame(date = c(as.Date("01-Jan-2012", format = "%d-%b-%Y"),
as.Date("01-Jul-2012", format = "%d-%b-%Y"),
as.Date("01-Jan-2013", format = "%d-%b-%Y")),
foo = LETTERS[1:3],
bar = 1:3)
# date foo bar
# 1 2012-01-01 A 1
# 2 2012-07-01 B 2
# 3 2013-01-01 C 3
接下来,我创建一个模板,每个月要填充行。
# Template to be filled
filled_df <- data.frame(date = seq(min(df$date), max(df$date), by = "month"))
# date
# 1 2012-01-01
# 2 2012-02-01
# 3 2012-03-01
# 4 2012-04-01
# 5 2012-05-01
# 6 2012-06-01
# 7 2012-07-01
# 8 2012-08-01
# 9 2012-09-01
# 10 2012-10-01
# 11 2012-11-01
# 12 2012-12-01
# 13 2013-01-01
最后,我将原始数据框加入模板并向下填充。
# Bind with original, then fill
filled_df %>%
left_join(df) %>%
fill(foo, bar)
# date foo bar
# 1 2012-01-01 A 1
# 2 2012-02-01 A 1
# 3 2012-03-01 A 1
# 4 2012-04-01 A 1
# 5 2012-05-01 A 1
# 6 2012-06-01 A 1
# 7 2012-07-01 B 2
# 8 2012-08-01 B 2
# 9 2012-09-01 B 2
# 10 2012-10-01 B 2
# 11 2012-11-01 B 2
# 12 2012-12-01 B 2
# 13 2013-01-01 C 3
请注意,我在约会中添加了一天,以避免出现问题。
答案 1 :(得分:0)
我相信自定义函数可以与mapply()
一起为您提供帮助。此示例重现原始数据帧,然后应用自定义函数,最后以组合的单个数据帧结束以匹配所需的结果。
# PRODUCING THE ORIGINAL DATA FRAME
df = data.frame(
Date = c(
format(as.Date("2012-01-01"),"%b-%Y"),
format(as.Date("2012-07-01"),"%b-%Y"),
format(as.Date("2013-01-01"),"%b-%Y")
),
V1 = c("Name1","Name3","Name5"),
V2 = c("Name2","Name4","Name6"),
stringsAsFactors = F
)
df
Date V1 V2
1 Jan-2012 Name1 Name2
2 Jul-2012 Name3 Name4
3 Jan-2013 Name5 Name6
# RESTRUCTURING
createSet = function(Date,V1,V2){
dat = as.Date(paste0(df$Date,"-01"),"%b-%Y-%d")
dat = format(seq(dat,by="month",length.out=6),"%b-%Y")
data.frame(Date=dat,V1=V1,V2=V2)
}
z = mapply(createSet,df$Date,df$V1,df$V2,SIMPLIFY=F)
do.call("rbind",z)
# RESULTING DATA FRAME
Date V1 V2
1 Jan-2012 Name1 Name2
2 Feb-2012 Name1 Name2
3 Mar-2012 Name1 Name2
4 Apr-2012 Name1 Name2
5 May-2012 Name1 Name2
6 Jun-2012 Name1 Name2
7 Jul-2012 Name3 Name4
8 Aug-2012 Name3 Name4
9 Sep-2012 Name3 Name4
10 Oct-2012 Name3 Name4
11 Nov-2012 Name3 Name4
12 Dec-2012 Name3 Name4
13 Jan-2013 Name5 Name6
14 Feb-2013 Name5 Name6
15 Mar-2013 Name5 Name6
16 Apr-2013 Name5 Name6
17 May-2013 Name5 Name6
18 Jun-2013 Name5 Name6