2013-05-05 75 views
0

考虑下面这个例子的n个发现相同的时间:的R - 在数据帧

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

听起来像是一个合并机会。如果您希望将它们分开而不是作为单个多列数据框,则可以拆分结果数据框。 – Thomas 2013-05-05 15:28:25

回答

1

zoo具有多路合并。这个乐队的read.zoolist1的组件将它们转换为动物园类。 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对象)。

+0

伟大的答案感谢您的帮助 – KatyB 2013-05-06 15:56:36

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,]应该得到期望的结果。

+0

或'%in%intersect(intersect(Dat1 [,1],Dat2 [,1]),Dat3 [,1])'? – Frank 2013-05-05 15:36:26

+0

尽管如此,如果你有3个以上的data.frames,这似乎相当冗长。它可以从中生成一个函数,在这里你可以插入一个数据框的列表,然后应用这些命令。 – KatyB 2013-05-05 15:43:52

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的;您可以使用这些索引记录在原始数据中。帧