2016-06-27 4 views
2

私はこのフォーマット効率サブセット化data.table複数回

> data = data.table(id = 1:10, date = seq(as.Date("2016-01-01"), by = 1, length = 10)) 
> data 
    id  date 
1: 1 2016-01-01 
2: 2 2016-01-02 
3: 3 2016-01-03 
4: 4 2016-01-04 
5: 5 2016-01-05 
6: 6 2016-01-06 
7: 7 2016-01-07 
8: 8 2016-01-08 
9: 9 2016-01-09 
10: 10 2016-01-10 

のデータを有するIクエリ/ Iプリフォームたいサブセットを別のマトリックスを有します。

> query = data.table(id = c(1,4,7), date_start = c("2016-01-01", "2016-01-01", "2016-01-01"), date_end = c("2016-01-04", "2016-01-02", "2016-01-03")) 
> query 
    id date_start date_end 
1: 1 2016-01-01 2016-01-04 
2: 4 2016-01-01 2016-01-02 
3: 7 2016-01-01 2016-01-03 

私はこのような何かをしたい:

subset(data, (id == query[1] & date > date_start[1] & date < date_end[1]) | 
     (id == query[2] & date > date_start[2] & date < date_end[2]) | 
     (id == query[3] & date > date_start[3] & date < date_end[3])) 

は自動的にforループを使用して、その結果をrbindingずにサブセットクエリが生成されています。

data.full <- merge(data,query,by="id", all.x=T) 

次に、あなたがqueryで参照されていない観測を除外し、それらが落ちた場合に参照されたものを維持したい場合は:あなたがちょうどそれらに参加することができ

おかげ

+0

データを正しくフォーマットした後で 'foverlaps(data、query、nomatch = 0)'を使うことができます( 'IDate'カラム、'?foverlaps'と '?IDate'を参照)。このQ&Aは助けになるかもしれません:http://stackoverflow.com/q/27487949/ – Frank

+0

私はfoverlapsが私が探しているものだと思います、答えとして返信すれば、私はそれを受け入れることができます。 – yingw

答えて

5

我々は少し

library(data.table) 
data = setDT(structure(list(id = 1:10, date = structure(16801:16810, class = c("IDate", 
"Date")), date2 = structure(16801:16810, class = c("IDate", "Date" 
))), .Names = c("id", "date", "date2"), row.names = c(NA, -10L 
), class = c("data.table", "data.frame"), sorted = c("id", 
"date", "date2"))) 

query = setDT(structure(list(id = c(1, 4, 7), date_start = 
structure(c(16801L, 
16801L, 16801L), class = c("IDate", "Date")), date_end = structure(c(16804L, 
16802L, 16803L), class = c("IDate", "Date"))), .Names = c("id", 
"date_start", "date_end"), row.names = c(NA, -3L), class = c("data.table", 
"data.frame"), sorted = c("id", 
"date_start", "date_end"))) 

を取得するにはOPのデータを変換する場合は... 。我々はこのアプローチのために

foverlaps(data, query, nomatch=0) 
# id date_start date_end  date  date2 
# 1: 1 2016-01-01 2016-01-04 2016-01-01 2016-01-01 

ようfoverlapsを使用することができ、その後、私は1つがマージする前にこれらのステップを取る必要だと思う:

+0

いかなる訂正も歓迎します。私は実際に 'foverlaps'を多く使うことはありません。関連するメモには – Frank

0
require(data.table) 
data = data.table(id = 1:10, date = seq(as.Date("2016-01-01"), by = 1, length = 10)) 
query = data.table(id = c(1,4,7), date_start = c("2016-01-01", "2016-01-01", 
"2016-01-01"), date_end = c("2016-01-04", "2016-01-02", "2016-01-03")) 

ファースト期間内でこれを行うことができます:

data.final <- data.full[date >= date_start & date <= date_end,] 

data.final 
    id  date date_start date_end 
1: 1 2016-01-01 2016-01-01 2016-01-04 

またはあなたがしたい場合EP queryで参照し、彼らは日付範囲に落ちた場合は参照されたものを維持していないされたレコード:

data.final <- data.full[is.na(date_start) | (date >= date_start & date <= date_end),] 
data.final 
    id  date date_start date_end 
1: 1 2016-01-01 2016-01-01 2016-01-04 
2: 2 2016-01-02   NA   NA 
3: 3 2016-01-03   NA   NA 
4: 5 2016-01-05   NA   NA 
5: 6 2016-01-06   NA   NA 
6: 8 2016-01-08   NA   NA 
7: 9 2016-01-09   NA   NA 
8: 10 2016-01-10   NA   NA 
+1

'[.data.table'の中に' data.full $ 'は必要ありません –

+1

@docendodiscimusああ、そうです。私はこれを書いたときにデータテーブルであると本当に考えなかった。幸いにもそれはまだこの方法で動作しますが、あなたのコメントは正しいです。私は先に進んで更新しました。 –

3

、あなたは直接non-equiのように結合を実行することができ、各テーブルの上にキーを設定し、メインデータ

  • に余分な日付列を作成IDate
  • としてすべての日付を持っています次のようになります。

    # data.table v1.9.7+ 
    data[query, .(id, x.date), on=.(id, date>=date_start, date<=date_end)] 
    

    nomatch=0Lを追加すると、一致しない行が削除されます。結果。

    .(id, x.date)は、非等価結合のデフォルト出力がどのように表示されるかを練習するまで必要です。

  • +0

    があります。クエリクエリの結合を行い、対角線を削除する方法はありますか? – yingw

    関連する問題