R - 在数据框中组合向量填充日期中的空白

时间:2015-05-05 21:20:01

标签: r vector merge dataframe gaps-in-data

我将月度观察和建模数据组织为矢量:

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

2 个答案:

答案 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