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 つのデータ フレームがあり、すべてのデータが同様の時間に測定されます。私は現在、すべてのデータ フレームが同一のタイム ステップを持っていること、つまりすべてが同時に測定されていることを確認しようとしています。2 つのデータ フレームに対してこれを行うことができます。

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

これら2つのデータフレームの一貫した時間のインデックスがわかります。次に、データ フレームを次のように再定義できます。

newDat1 <- Dat1[idx1,]

必要なデータを取得します。

私の質問は、これをすべてのデータフレーム、つまり2つ以上にどのように適用するかです。私は試しました:

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

しかし、これは完全に間違っていることがわかります。助言がありますか?私は多くのデータ フレーム (5 つ以上) を持っており、それぞれに異なる変数が含まれていることに注意してください。

編集:

これを行うことができる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
}

問題の 4 つのデータフレームに共通のタイムスタンプがないことに注意してください。

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

ただし、最初の 3 つのデータフレームには共通のタイムスタンプが 1 つあります。

> 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 に答える