1

我将每月观察和建模的数据组织为向量:

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
4

2 回答 2

3

虽然@Alex A. 的答案有效,但由于它是日期/时间数据,因此从一开始就以这种方式对待它可能是有益的。您可以使用带有 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)

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

于 2015-05-05T21:51:57.190 回答
1

首先将您的数据帧从“宽”格式转换为“长”格式。

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")

现在您可以删除"X"using gsub

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

NA当数据框与 合并时,将分配存在于一个数据框中而不是另一个数据框中的任何值all = TRUE

于 2015-05-05T21:35:44.203 回答