R:用数据填充数据框,然后将值匹配到正确的日期

时间:2018-09-04 21:37:52

标签: r

实际上,我的处境非常混乱。我有60个单表,其中包含2009-01-01至2017-09-30日期之间的数据。但是,值并不是每天都连续。每个月有几张表或三天一次的数据。有时每个月的每一天都有价值。

我想找出每年数据的最高频率。以后需要插值。

我的想法:我建立了一个数据框,第一列是2009-01-01到2017-09-30连续的日期。现在,我要用数据不连续的60个表填充此数据框。

我需要一个代码来将数据匹配到data frame WholeData中的正确日期(请参见示例)。而且我不再需要单个表的日期,因为它已经在第一列中了。

示例代码简化:

    df1 <- sample(seq(as.Date('2009-01-01'), as.Date('2009-09-30'), by = "day"), 
    12)
    df1 <- sort(df1)
    expenses1 <- sample(180, 12)

    df1 <- data.frame(df1, expenses1)

    df2 <- sample(seq(as.Date('2009-01-01'), as.Date('2009-09-30'), by = "day"), 
    12)
    df2 <- sort(df2)

    expenses2 <- sample(180, 12)

    df2 <- data.frame(df2, expenses2)

    WholeData <- seq(as.Date("2009-01-01"), by = 1, as.Date("2009-09-30"))
    df <- data.frame(WholeData)

df1df2代表我的60张凌乱的桌子。时间间隔也缩短了。

1 个答案:

答案 0 :(得分:1)

首先,我建议将您所有的数据帧组织到一个列表中:

data_list <- list(df, df1, df2)

Here是一个完美的解释,它为什么如此重要以及可以使用哪些更高级(和可扩展!)的方法。

此外,为所有包含日期​​值的列设置相同的名称是很有意义的:

for (i in seq(along.with = data_list)) {
    colnames(data_list[[i]])[1] <- "date"
}

"date"列将是用于进一步结合数据帧的关键列。

现在,完成预处理后,您可以选择the available methods中的一个来构建最终数据帧。

# with base R
res_1 <- Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "date", all.x = TRUE),
        data_list)

#using tidyverse tools
library(tidyverse) 

# with purr package
res_2 <- data_list %>% purrr::reduce(full_join, by = "date")

# with dplyr package
res_3 <- data_list %>%
    Reduce(function(dtf1, dtf2) dplyr::full_join(dtf1, dtf2, by = "date"), .)