4

私は2つのベクトルを持っています:

x<-c(0,1,0,2,3,0,1,1,0,2)
y<-c("00:01:00","00:02:00","00:03:00","00:04:00","00:05:00",
     "00:06:00","00:07:00","00:08:00","00:09:00","00:10:00")

yの値が0で中断されていない、の値だけを選択する必要がありますx。その結果、次のようなデータフレームを取得したいと思います。

y        x
00:04:00 2
00:05:00 3
00:07:00 1
00:08:00 1

このようなスクリプトを作成しましたが、大きなデータセットでは時間がかかります。よりエレガントな解決策はありますか?そして、なぜdf<-rbind(bbb,df)逆dfを返すのだろうか?

aaa<-data.frame(y,x)
df<-NULL
for (i in 1:length(aaa$x)){
  bbb<-ifelse((aaa$x[i]*aaa$x[i+1])!=0, 
              aaa$x[i], 
              ifelse((aaa$x[i]*aaa$x[i-1])!=0, 
                     aaa$x[i], 
                     NA))
  df<-rbind(bbb,df)
}
df<-data.frame(rev(df))
aaa$x<-df$rev.df.
bbb<-na.omit(aaa)
bbb

私はRの初心者なので、できるだけ詳しく説明してください:)ありがとうございます!

4

1 に答える 1

2
aaa <- data.frame(y,x)
rles <- rle(aaa$x == 0)
bbb <- aaa[rep(rles$values == FALSE & rles$lengths >= 2, rles$lengths),]

これは

> bbb
         y x
4 00:04:00 2
5 00:05:00 3
7 00:07:00 1
8 00:08:00 1

あなたが持っていたサブ質問:残りの(既存の)行の前に新しい行()を追加しているため、逆になりdf<-rbind(bbb,df)ます。引数の順序を逆にすると、逆にする必要はありません。dfbbbdf

それは多くの部分を含むので、今答えを分解します。まず、基準を言い換えるとaaa、少なくとも2行に0がないストレッチが必要です。したがって、最初の基準は0を見つけることです

> aaa$x == 0
 [1]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE

次に、これらの各ストレッチの長さを把握します。rleこれを行います。

> rle(aaa$x == 0)
Run Length Encoding
  lengths: int [1:8] 1 1 1 2 1 2 1 1
  values : logi [1:8] TRUE FALSE TRUE FALSE TRUE FALSE ...

これは、1 TRUE、次に1 FALSE、次に1 TRUE、次に2FALSE秒などがあったことを意味します。この結果はに割り当てられrlesます。必要な部分は、値がFALSE(0ではなく)であり、その実行の長さが2以上である場所です。

> rles$values == FALSE & rles$lengths >= 2
[1] FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE

aaaこれは、の長さに拡張する必要があり、適切なエントリを複製するためrepにを使用してそれを行います。rles$lengths

> rep(rles$values == FALSE & rles$lengths >= 2, rles$lengths)
 [1] FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE

これにより、インデックス作成に適した論理ベクトルが得られますaaa

> aaa[rep(rles$values == FALSE & rles$lengths >= 2, rles$lengths),]
         y x
4 00:04:00 2
5 00:05:00 3
7 00:07:00 1
8 00:08:00 1
于 2012-10-08T22:51:14.860 に答える