2017-07-15 5 views
2

特定の条件を満たす行の後にx行以内にあるデータフレーム内の行を削除しようとしています。特定の条件の行を囲むデータフレーム内の行のバッファを削除する方法

私は、応答変数、条件を表す測定タイプ、および時間を持つデータフレームを持っています。ここではモックのデータセットです。このモック場合

data <- data.frame(rlnorm(45,0,1), 
     c(rep(1,15),rep(2,15),rep(1,15)), 
     seq(
      from=as.POSIXct("2012-1-1 0:00", tz="EST"), 
      to=as.POSIXct("2012-1-1 0:44", tz="EST"), 
      by="min")) 
names(data) <- c('Variable','Type','Time') 

、私は条件2が発生した後の状態1で最初の5行を削除します。

dist = vector() 
for(i in 1:nrow(data)) { 

    if(data$Type[i] != 1) dist[i] <- 0 

    else { 
     position = i 
     tempcount = 0 
     while(position > 0 && data$Type[position] == 1){ 
      position = position - 1 
      tempcount = tempcount + 1 
     } 
     dist[i] = tempcount 
    } 
} 

このコード:

私はこの問題を解決する方法を考えましたが1である各観測は、ここでの最後の2からある距離を決定する別のベクトルを生成することでした私が書いたコードですそのトリックを行いますが、非常に非効率です。私は、誰かがより洗練された、より速い解決策を持っていたかどうか疑問に思いました

答えて

1

私が正しくあなたを理解していれば、これはトリックを行う必要があります。

criteria1 = which(data$Type[2:nrow(data)] == 2 & data$Type[2:nrow(data)] != data$Type[1:nrow(data)-1]) +1 
criteria2 = as.vector(sapply(criteria1,function(x) seq(x,x+5))) 
data[-criteria2,] 

をどのように動作します:

  1. criteria1がタイプ== 2が、前の行が同じではありませんインデックスを含みますタイプ。 2:nrow(データ)のような奇妙なlookignサブセットは前の行と比較したいので、最初の行は前の行がありません。これまでに+1を追加しました。
  2. criteria2第三行はサブセット

を行う

  • 5 +これらの数字には、この小さな変更を必要とするかもしれない、criteria1に番号で始まる配列を含む、私はどのような基準1及び基準正確に明らかではなかったです2はあなたのコードからのものでした。これが機能しているか、これ以上アドバイスが必要な場合はお知らせください。

  • +0

    これは素晴らしい動作です!ありがとう! – user2130093

    +0

    恐ろしい、私は助けることができてうれしい。あなたが私の答えを受け入れることができれば、それはすばらしいチェックマークをクリックして;) – Florian

    +0

    @ user2130093あなたの質問は不明です。あなたのタイトルは、基本的に "行をドロップ_ _行の条件行"と書いています。テキストでは、 "行を削除したいかどうか(条件= 2?)"と書いています。この答えは_before_ Type = 2の行を削除します。明確にしてください - 例を小さくし、期待される出力を表示します(たとえば、冗長変数を削除して行数を減らします)。 – Henrik

    関連する問題