1

我是一个 R 新手,发现从 matlab 转换相当棘手,所以提前为这可能是一个非常简单的问题道歉。

我正在分析一些时间序列数据,下面概述的问题说明了我在 R 中遇到的问题:

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))

所以,这里我有 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] %in% intersect(intersect(intersect(Dat1[,1],Dat2[,1]),Dat3[,1]),Dat4[,1]))

这将给出索引,并可用于定义一个新变量:

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

尽管此示例适用于此示例,但我希望找到一种方法使此工作适用于 n 个数据帧,而无需重复此 n 次

4

2 回答 2

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)

但是前三个数据帧中有一个共同的时间戳

> 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
于 2013-05-06T17:26:26.800 回答
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]))
于 2013-05-07T03:56:59.203 回答