2013-05-06 64 views
1

我是一個R新手,我發現從matlab轉換相當棘手,所以提前道歉可能是一個非常簡單的問題。找到相應的日期時間在幾個時間序列中R

我分析了一些時間序列數據和下面列出的問題證明了我R中遇到的問題:在這裏我有,所有的數據都在相似的時間測得的5個數據幀

Dat1 <- data.frame(dateTime = as.POSIXct(c("2012-05-03 00:00","2012-05-03 02:00", 
              "2012-05-03 02:30","2012-05-03 05:00", 
              "2012-05-03 07:00"), tz = 'UTC'),x1 = rnorm(5)) 
Dat2 <- data.frame(dateTime = as.POSIXct(c("2012-05-03 01:00","2012-05-03 01:30", 
              "2012-05-03 02:30","2012-05-03 06:00", 
              "2012-05-03 07:00"), tz = 'UTC'),x1 = rnorm(5)) 
Dat3 <- data.frame(dateTime = as.POSIXct(c("2012-05-03 00:15","2012-05-03 02:20", 
              "2012-05-03 02:40","2012-05-03 06:25", 
              "2012-05-03 07:00"), tz = 'UTC'),x1 = rnorm(5)) 
Dat4 <- data.frame(dateTime = as.POSIXct(c("2010-05-03 00:15","2010-05-03 02:20", 
              "2010-05-03 02:40","2010-05-03 06:25", 
              "2010-05-03 07:00"), tz = 'UTC'),x1 = rnorm(5)) 

所以。我現在試圖確保所有數據幀具有相同的時間步長,即全部同時測量。我可以這樣做兩個數據幀:

idx1 <- (Dat1[,1] %in% Dat2[,1]) 

這將告訴我在這兩個數據幀中的一致時間的索引。然後我可以通過

newDat1 <- Dat1[idx1,] 

重新定義數據幀以獲得所需的數據。

我現在的問題是,如何我申請這所有的數據幀,即超過2個。我曾嘗試:

idx1 <- (Dat1[,1] %in% (Dat2[,1] %in% (Dat3[,1] %in% Dat4[,1]))) 

,但我可以看到,這是完全錯誤的。有什麼建議麼?請記住,我有很多數據框(超過五個),每個數據框包含不同的變量。

編輯:

我可能已經發現一種方法可以做到這一點:

IDX1 < - (DAT1 [1]%中%相交(交點(交叉(DAT1 [1],DAT2 [1]),DAT3 [1]),DAT4 [1]))

這將給指數,並且可用於定義一個新的變量:

Dat1 <- Dat1[idx1,] 
Dat2 <- Dat2[idx1,] 
Dat3 <- Dat3[idx1,] 
Dat4 <- Dat4[idx1,] 

雖然這個工作對於這個例子,我希望找到一種方法使這項工作對於數據幀的n個,而無需編寫重複的次這樣的n個

+0

查看http://stackoverflow.com/questions/16385909/r-find-same-timesi-i n-n個數據幀/ 16387158#16387158 – 2013-05-06 23:23:21

回答

0

爲了鑑定通用於所有的數據幀的時間戳的,創建一個函數來返回多個矢量的交點

intersectMulti <- function(x=list()){ 
for(i in 2:length(x)){ 
    if(i==2) foo <- x[[i-1]] 
    foo <- intersect(foo,x[[i]]) #find intersection between ith and previous 
} 
return(x[[1]][match(foo, x[[1]])]) #get original to retain format 
} 

注意,有在問題

> intersectMulti(x=list(Dat1[,1],Dat2[,1],Dat3[,1],Dat4[,1])) 
character(0) 

四個dataframes之間沒有共同的時間戳,但有一個共同的時間戳前三dataframes

> intersectMulti(x=list(Dat1[,1],Dat2[,1],Dat3[,1])) 
[1] "2012-05-03 07:00:00 UTC" 

從功能使用該結果子集共同時間戳每個數據幀的行:

m <- intersectMulti(x=list(Dat1[,1],Dat2[,1],Dat3[,1])) 

Dat1 <- Dat1[Dat1$dateTime %in% m,] 
Dat2 <- Dat2[Dat2$dateTime %in% m,] 
Dat3 <- Dat3[Dat3$dateTime %in% m,] 
Dat4 <- Dat4[Dat4$dateTime %in% m,] 

> Dat1 
      dateTime   x1 
5 2012-05-03 07:00:00 -0.1607363 

> Dat2 
     dateTime   x1 
5 2012-05-03 07:00:00 -0.2662494 

> Dat3 
      dateTime   x1 
5 2012-05-03 07:00:00 -0.1917905 
+0

這裏的總體目標是改變已經定義的數據幀,即改變Dat1,Dat2,Dat3,Dat4以使行對應於你所顯示的索引。我不清楚這是如何實現的。 – user2355358 2013-05-06 21:10:41

+0

我上面編輯的子集從每個數據框的匹配行。這是你想要的嗎?要返回每個Dat的索引,只需使用'match(m,Dat1 $ dateTime)'而不是子集。 – 2013-05-07 16:05:32

0

如果這對你的作品:

idx1 <- (Dat1[,1] %in% intersect(intersect(intersect(Dat1[,1],Dat2[,1]),Dat3[,1]),Dat4[,1])) 

那就試試這個,它適用於列表/向量和更優雅:

idx1 <- Dat1[,1] %in% Reduce(intersect, list(Dat1[,1], Dat2[,1], Dat3[,1], Dat4[,1])) 
相關問題