r - 在n个数据帧中找到相同的时间

时间:2013-05-05 15:10:31

标签: r subset

考虑以下示例:

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

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中的记录