R - 合并数据框中的向量以填补日期中的空白

R - combine vectors in data frame filling gaps in date

我每月观察并建模数据组织为向量:

obs <- structure(c(68.72228685137, 68.4565130874024, 68.3237563140977, 
66.1789683147099, 63.7162100107148, 59.9698454002755), .Names = c("X1901.01.01", 
"X1901.02.01", "X1901.03.01", "X1901.04.01", "X1901.05.01", "X1901.06.01"
))

mod <- structure(c(71.5796750030741, 71.5925210418478, 70.8672045288309, 
67.9705857323206, 68.462614970737, 67.7095309202574), .Names = c("X1899.11.01", 
"X1899.12.01", "X1901.01.01", "X1901.02.01", "X1901.03.01", "X1901.04.01"
))

其中X1901.01.01对应1901-01-01等等。请注意,观察数据和模型数据中的日期并不完全重叠。

这只是一个示例 - 我的真实数据包含数千个观察结果。

将这些向量组合到一个数据框中的最有效(即最快)方法是什么,将 NA 分配给不匹配的日期并去掉前面臭名昭著的 "X"原始日期?

这将是生成的数据框:

   date         obs             mod
1899.11.01      NA              71.57968
1899.12.01      NA              71.59252
1901.01.01      68.72229        70.86720    
1901.02.01      68.45651        67.97059
1901.03.01      68.32376        68.46261    
1901.04.01      66.17897        67.70953    
1901.05.01      63.71621            NA
1901.06.01      59.96985            NA

首先将您的数据帧从 "wide" 格式转换为 "long" 格式。

library(reshape2)

m.obs <- melt(obs, id.vars = NULL)
m.mod <- melt(mod, id.vars = NULL)

转置后,日期现在是行名。然后您可以合并行名称。

both <- merge(m.obs, m.mod, by = "row.names", all = TRUE)

根据需要设置列名称。

colnames(both) <- c("date", "obs", "mod")

现在您可以使用 gsub 删除 "X"

both <- transform(both, date = gsub("X", "", date))

当数据帧与 all = TRUE.

合并时,将分配存在于一个数据帧中而不是另一个数据帧中的任何值 NA

虽然@Alex A. 的答案有效,但由于它是 date/time 数据,因此从一开始就以这种方式处理它可能会有所帮助。您可以使用带有 all=TRUE 标志集的 merge() 函数轻松合并它们,这将合并任何相同的列名:

obs <- as.data.frame(obs)
mod <- as.data.frame(mod)
obs[["date"]] <- as.Date(row.names(obs), "X%Y.%m.%d")
mod[["date"]] <- as.Date(row.names(mod), "X%Y.%m.%d")

d <- merge(obs, mod, all=TRUE)

由于日期列是 date/time class,因此您可以轻松地将 data.frame 转换为 xts 时间序列或其他用于子集化、汇总等的内容。