2013-05-06 63 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])) 
相关问题