考虑以下示例:
Date1 = seq(from = as.POSIXct("2010-05-03 00:00"),
to = as.POSIXct("2010-06-20 23:00"), by = 120)
Dat1 <- data.frame(DateTime = Date1,
x1 = rnorm(length(Date1)))
Date2 <- seq(from = as.POSIXct("2010-05-01 03:30"),
to = as.POSIXct("2010-07-03 22:00"), by = 120)
Dat2 <- data.frame(DateTime = Date2,
x1 = rnorm(length(Date2)))
Date3 <- seq(from = as.POSIXct("2010-06-08 01:30"),
to = as.POSIXct("2010-07-13 11:00"), by = 120)
Dat3Matrix <- matrix(data = rnorm(length(Date3)*3), ncol = 3)
Dat3 <- data.frame(DateTime = Date3,
x1 = Dat3Matrix)
list1 <- list(Dat1,Dat2,Dat3)
这里我构建了三个data.frames作为示例,并将它们全部放入列表中。从这里开始,我想写一个例程,该例程将返回3个数据帧,但只保留其他每个数据帧中存在的时间,即所有三个数据帧应该减少到所有数据帧中一致的时间。如何才能做到这一点?
答案 0 :(得分:1)
zoo
有一个多向合并。这个la {{{}} read.zoo
覆盖list1
的组件,每个组件将它们转换为动物园类。 tz=""
告诉它使用POSIXct来生成日期/时间。然后,它使用all=FALSE
合并转换后的组件,以便仅保留相交时间。
library(zoo)
z <- do.call("merge", c(lapply(setNames(list1, 1:3), read.zoo, tz = ""), all = FALSE))
如果我们以后希望将z
转换为data.frame,请尝试dd <- cbind(Time = time(z), coredata(z))
,但最好将其保存为动物园对象(或将其转换为xts对象),以便进一步处理也简化了。
答案 1 :(得分:0)
一种方法是找到相应的索引,然后相应地进行分组:
idx1 <- (Dat1[,1] %in% Dat2[,1]) & (Dat1[,1] %in% Dat3[,1])
idx2 <- (Dat2[,1] %in% Dat1[,1]) & (Dat2[,1] %in% Dat3[,1])
idx3 <- (Dat3[,1] %in% Dat1[,1]) & (Dat3[,1] %in% Dat2[,1])
现在Dat1[idx1,]
,Dat2[idx2,]
,Dat3[idx3,]
应该会提供所需的结果。
答案 2 :(得分:0)
您可以使用merge
:
res <- NULL
for (i in 2:length(list1)) {
dat <- list1[[i]]
names(dat)[2] <- paste0(names(dat)[2], "_", i);
dat[[paste0("id_", i)]] <- 1:nrow(dat)
if (is.null(res)) {
res <- dat
} else {
res <- merge(res, dat, by="DateTime")
}
}
我添加了带有id的列;您可以使用它们来索引原始data.frames中的记录