【问题标题】:R: Fill up data frame with data and match values to the right dateR:用数据填充数据框并将值匹配到正确的日期
【发布时间】:2018-09-04 21:37:51
【问题描述】:

实际上,我的情况非常混乱。我有 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 张凌乱的桌子。时间间隔也缩短了。

【问题讨论】:

  • 看看dplyr::join_all

标签: r


【解决方案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"), .)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2021-02-12
    • 2020-04-09
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多