7

私は巨大なデータフレームを持っています。1 つの列は 1 から 2 の範囲の整数です。必要なのは、この列で特定の値の数を持つ連続した行を探し、これらの行をサブセット化し、後でグラフに処理する方法です。

必要な作業の少なくとも一部を実行する小さな例を添付しました。探しているサブセットを印刷できます。しかし、次の 2 つの疑問が残ります。

  • Rには、完全なdata.frameに「for」ループを適用するよりスマートな方法があると思います。ヒントはありますか?
  • 「印刷」コマンドが一時的なdata.frameを保存する場所に、どのコマンドを入力する必要がありますか? サブセットの長さが異なるため、リストが必要だと思います...

私はすでにaggregateまたはddplyを見てきましたが、解決策を思いつくことができませんでした.

どんな助けでも大歓迎です。

test<-c(rep(1,3),rep(2,5),rep(1,3),rep(2,3),rep(1,3),rep(2,8),rep(1,3)) 
letters<-c("a","b","c","d")
a1<-as.data.frame(cbind(test,letters))

BZ<-2   #The variable to look for
n_BZ=4  #The number of minimum appearences

k<-1  # A variable to be used as a list item index in which the subset will be stored

for (i in 2:nrow(a1)){
  if (a1$test[i-1]!=BZ & a1$test[i]==BZ)      # When "test" BECOMES "2"
    {t_temp<-a1[i,]}                            #... start writing a temporary array
  else if (a1$test[i-1]==BZ & a1$test[i]==BZ) # When "test" REMAINS "2"
    {t_temp<-rbind(t_temp,a1[i,])}              #... continue writing a temporary array 
  else if (a1$test[i-1]==BZ & a1$test[i]!=BZ) # When "test" ENDS BEING "2"
    {if (nrow(t_temp)>n_BZ)                     #... check if the temporary array has more rows then demanded
      {print(t_temp)                              #... print the array (desired: put the array to a list item k)
       k<-k+1}}                                   #... increase k
    else                                      # If array too small
    {t_temp<-NULL}                              # reset
}
4

1 に答える 1

6

このrle機能は、このようなものに非常に便利です。listこれはアトミック ベクトルを取り、要素lengthsおよびを含むを返しますvalues。ここでlengths、 の各値の実行長が含まれますvalues

cbindあなたの例での への呼び出しはtest列をに強制するので、factor最初に に変換しましたnumeric:

a1 <- within(a1, test <- as.numeric(as.character(test)))

次に、結果は素敵な(本質的に)ワンライナーで取得できます。

with(rle(a1$test),
    split(a1, rep(seq_along(lengths), lengths))[values == BZ & lengths >= n_BZ]
)
于 2012-10-24T13:51:57.413 に答える