0

考虑以下示例:

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 个数据帧,但只保留每个其他数据帧中存在的时间,即所有三个数据帧都应该减少到所有数据帧之间一致的时间。如何才能做到这一点?

4

3 回答 3

1

zoo具有多路合并。这个 lapply 完成read.zoolist1将它们每个转换为 zoo 类的组件。 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)),但最好将其保留为 zoo 对象(或将其转换为 xts 对象),以便进一步简化处理。

于 2013-05-05T17:30:04.173 回答
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,]应该给出想要的结果。

于 2013-05-05T15:33:36.760 回答
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 中的记录

于 2013-05-05T15:36:11.353 回答