实际上,我的处境非常混乱。我有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)
df1
和df2
代表我的60张凌乱的桌子。时间间隔也缩短了。
答案 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"), .)