2017-02-02 2 views
2

特定のカテゴリを持つすべての日付のdata.tableをチェックし、そのすべての日付を別のdata.tableのTRUEに設定します。特定のカテゴリが存在する場合data.table内の値を含むすべての行を取得する正規表現ですか?

DT2 = fread(' 
Date  A  B  C  D 
2010-01-01 FALSE FALSE FALSE FALSE 
2010-01-02 FALSE FALSE FALSE FALSE 
2010-01-03 FALSE FALSE FALSE FALSE 
2010-01-04 FALSE FALSE FALSE FALSE 
2010-01-05 FALSE FALSE FALSE FALSE') 
DT2[, Date := as.IDate(Date) ] 

:私はこのようになりますdata.tableあります

library(data.table) 
DT1 = fread(
'Date   Category 
2010-01-01 A 
2010-01-01 B 
2010-01-02 A 
2010-01-02 C 
2010-01-02 D 
2010-01-04 B 
2010-01-04 "B OR D"') 
DT1[, Date := as.IDate(Date) ] 

を、私はこのようになり、データフレームに値を抽出しようとしています与えられた日付、行の日付とカテゴリの列をtrueに設定したいと思います。今、私のコードはany(grep())を使用しています

Date  A  B  C  D 
2010-01-01 TRUE FALSE FALSE FALSE 
2010-01-02 TRUE FALSE FALSE FALSE 
2010-01-03 FALSE FALSE FALSE FALSE 
2010-01-04 FALSE FALSE FALSE FALSE 
2010-01-05 FALSE FALSE FALSE FALSE 

、それが変化するため、問題である:私はこの呼び出しはこのように見えるDT2を変更したい

DT2 <- DT2[Date %in% DT1$Date, A := grep(something)] 

:私はこれはおそらくのようなものを必要とすることを知っていますDT2$A[4]TRUE、私は望んでいません。私のカテゴリのセルのいくつかは複数の値を参照しているので、私は正規表現を使用したいと思います。最後のセルのため、値Bと値Dの両方のチェックでは、ダミー変数2010-01-04をtrueに設定する必要があります。最後の2行が示すように、1つのカテゴリに対する複数の参照を含む1つの日付が存在することがあります。

これをdata.tableで行う方法はありますか?絶対に必要な場合は他のパッケージを使うことができます。

dcastを使用して、必要なすべての日付が含まれていないため、D1を適切なdata.tableに変換することはできません。

+0

が、それはあなたが必要な日数が分(日)から最大(に常にあることをケースですが、日付)? – Frank

+1

良い質問です!日付は実際にmax(Date)を過ぎて1つ進みます。私は私の質問を編集しますが、私は今それをやる方法を知っています。 – Pokey

+1

よかったです。 Fyiは、通常、回答が投稿された後に質問を編集する場合、ここでの礼儀は、あなたの変更を説明するための回答を編集する(あなたが知っている場合)か、答えにコメントすることです。よく分かりません)。とにかく、関連する編集は 'max(Date)'〜 'max(Date)+ 1L'のようです。 – Frank

答えて

2

ここで可能なカテゴリ(調整用@Frankに帽子・チップ)をループで作成された一つの試みです:

DF1[ 
    .(seq(min(Date), max(Date) + 1L, by="day")), 
    on=.(Date), 
    lapply(sapply(c("A","B","C","D"), grepl, x=Category, USE.NAMES=TRUE, simplify=FALSE),any), 
    by=.EACHI 
] 
#   Date  A  B  C  D 
#1: 2010-01-01 TRUE TRUE FALSE FALSE 
#2: 2010-01-02 TRUE FALSE TRUE TRUE 
#3: 2010-01-03 FALSE FALSE FALSE FALSE 
#4: 2010-01-04 FALSE TRUE FALSE TRUE 
#5: 2010-01-05 FALSE FALSE FALSE FALSE 
+0

Ahh、もちろん 'grepl'の' sapply'に 'lapply'を使っています。すべてが1つのコマンドで実行できることはとても素晴らしいことです! – Pokey

関連する問題