2013-05-05 102 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的;您可以使用這些索引記錄在原始數據中。幀