我将月度观察和建模数据组织为矢量:
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
分配给不匹配的日期并摆脱臭名昭着的&#34; X&#34;在原始日期的前面?
这将是结果数据框:
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
答案 0 :(得分:3)
虽然@Alex答案有效,但由于它的日期/时间数据,从一开始就以这种方式对待它可能是有益的。您可以使用merge()函数和all = TRUE标志集合轻松地合并它们,它将合并在任何相同的列名称上:
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时间序列或其他用于子集化,汇总等的其他内容。
答案 1 :(得分:1)
首先转换来自&#34;宽&#34;的数据帧。到&#34;长&#34;格式。
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"
删除gsub
。
both <- transform(both, date = gsub("X", "", date))
当数据框与NA
合并时,一个数据帧中存在的任何值都将被分配all = TRUE
。