8

たとえば、6 月 15 日に始まり翌月 15 日に終わる夏休みなどを除いて、たとえば日と月に基づいてデータテーブルからいくつかの行を除外しようとしています。Date に基づいてそれらの日を抽出できますが、as.Date 関数の操作が非常に遅いため、Month と Day に個別の整数列があり、それらのみを使用して実行したいと考えています。

指定されたエントリを選択するのは簡単です

DT[Month==6][Day>=15]
DT[Month==7][Day<=15]

data.tables2つ(元のものと私が選択したもの)の「違い」を作る方法はありますか?(サブセット化しないのはなぜですか?単純なものが欠けているのかもしれませんが、10/6、31/7のような日を除外したくありません。)

私はjoinでそれを行う方法を知っていますが、毎日しかありません

setkey(DT, Month, Day)
DT[-DT[J(Month,Day), which= TRUE]]

より一般的な方法でそれを解決する方法を誰かが助けることができますか?

4

2 に答える 2

3

素晴らしい質問です。質問に一致するように質問のタイトルを編集しました。

as.Dateうまく読むことを避ける簡単なアプローチ:

DT[!(Month*100L+Day) %between% c(0615L,0715L)]

多くの場合、これはおそらく十分に高速です。あなたがたくさんの異なる範囲を持っているなら、あなたはギアをステップアップしたいかもしれません:

DT[,mmdd:=Month*100L+Day]
from = DT[J(0615),mult="first",which=TRUE]
to = DT[J(0715),mult="first",which=TRUE]
DT[-(from:to)]

DIYなので、少し長くてエラーが発生しやすくなります。したがって、1つのアイデアはlist、テーブルの列がi範囲クエリを表すということです(FR#203、バイナリ検索のように%between%)。次に、not-join(これもまだ実装されていません。FR#1384)をリスト列範囲クエリと組み合わせて、要求したとおりに実行できます。

setkey(DT,mmdd)
DT[-J(list(0615,0715))]

これは、通常の方法で、複数の異なる範囲、または多くの異なるIDの同じ範囲に拡張されます。つまり、より多くの行がに追加されiます。

于 2012-10-22T21:08:32.873 に答える
1

hereの回答に基づいて、次のようなものを試すことができます

# Sample data
DT <- data.table(Month = sample(c(1,3:12), 100, replace = TRUE),
  Day = sample(1:30, 100, replace = TRUE), key = "Month,Day")

# Dates that you want to exclude
excl <- as.data.table(rbind(expand.grid(6, 15:30), expand.grid(7, 1:15)))

DT[-na.omit(DT[excl, which = TRUE])]

除外したい日ごとに少なくとも 1 つのエントリがデータに含まれている場合は、na.omit必要ない可能性があります。

于 2012-10-22T19:10:38.210 に答える