r-使用另一个数据帧中的值按时间序列填充数据

时间:2018-06-20 14:51:43

标签: r

我每半年有一组数据,每六个月有一个名字。如何使用原始数据框中的半年名称创建每月时间序列?

为清楚起见,我正在尝试创建此文件:

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...

任何帮助将不胜感激!

2 个答案:

答案 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