2011-07-27 10 views
1

私はdatetime列を持つデータテーブル(dt)を持っています。私はまたdatetimes(L)の別のリストを持っています。リスト内の一致から+ N個のエントリを含むサブ設定行

dtのdatetime列に対して、Lの項目の一致ごとに+/- N行のdtのサブセットを返すにはどうすればよいですか?

私はできるだけ一般的にこれをやってみたいと思っています。だから、このケースはdatetimeですが、因子と整数についてもやってみたいと思います。理想的には、これによって重複も除外されます。

これは基本的にはgrep 'foo|foo1' -A10 -B10のようなもので、 "fooまたはfoo1に一致する行を前後に10行表示する"と解釈されます。

+1

サンプルデータがありますか?砂糖を上に載せることはできますか? –

答えて

4

ので、一例として

dt <- data.frame (dt = 101 : 200) 
L <- c (163, 200, 131) 

その後、あなたのマッチの行番号は、今、あなたは後に1にする前に、3行から欲しい

matches <- which (dt$dt %in% L) 

を言っている:今

extrarows <- -3 : 1 

outerはあなたの友人です:

rows <- outer(extrarows, matches, `+`) 

は、あなたが探しているものを、私たちは

  • エントリがすべての有効な行番号(rowsで負の数があるかもしれない)していることを確認する必要があり、ほとんどです:

    rows <- rows [rows %in% seq_len (nrow (dt))]

  • あなたはまた、重複を取り除きたいことがあります。

    rows <- unique (rows)

  • あなたがrowsのマトリックス構造を保持したい場合は、多分NAに無効なインデックスを設定すると、それらを削除するよりも優れている:

    rows [! rows %in% seq_len (nrow (dt))] <- NA

今あなたが

dt [rows,] 
+0

「外側」をうまく使う。 2つのマッチがお互いに近い場合、重複を取り除く必要があります。 –

+0

@cbeleites。エレガントな答え。 Rhelpのあなたの素晴らしい仕事の典型です。 –

+0

DWin、ありがとう!リッチー、場合によってはマトリックス構造(すなわち、一致ごとに一定数の結果行)も有用である。それに応じて更新しました。ありがとう。 – cbeleites

2

を返しますあなたのデータを見ることなく正確なコードを与えるのは難しいですが、おそらく例えば、

match_index <- which(dt$some_column %in% L) 

今のところ、前後の行を取得する方法を示すために数字を構成しています。各マッチについて

match_index <- c(1, 33, 35, 50) 
n <- 55  #in practice, this will be nrow(dt) 

、データの範囲外にある番号をスキップして、その後10前10の値からの値の配列を取得します。

all_values <- lapply(match_index, function(x) seq.int(max(1, x - 10), min(x + 10, n))) 

単一のベクターに結合する。

all_values <- do.call(c, all_values) 

重複を削除します。

all_values[!duplicated(all_values)] 
+1

また素敵です! 'c'を呼び出す代わりに、' unlist(all_values) 'も別のオプションです。 – cbeleites

関連する問題