2016-11-05 4 views
1

来る新しい行の条件付き挿入は、私のデータフレームが(経験豊富なコミュニティからの素敵な編集のおかげで)どのように見えるかです:ダイナミック、次の特定の日の後に

主要データフレームDF
library(data.table) 
df <- fread('Account  Date  Blue  Red Amount 
      A   1/1/2016  1  0  100  
      A   2/1/2016  1  1  200  
      B   1/10/2016  0  1  300  
      B   2/10/2016  1  1  400') 
df[, Date := as.Date(Date, format="%m/%d/%Y")] 

blue <- fread('Date  Amount 
       6/1/2015 55  
       1/31/2016 55  
       2/28/2016 65  
       3/31/2016 75') 
blue[, Date := as.Date(Date, format="%m/%d/%Y")] 

red <- fread('Date  Amount 
      12/31/2015 43  
      1/15/2016 47  
      2/15/2016 67  
      3/15/2016 77') 
red[, Date := as.Date(Date, format="%m/%d/%Y")] 

のフィールドは、アカウントが特定の時点に属していることを示しています。たとえば、2011年1月1日現在、アカウントAはブルーカテゴリにのみ属しています。 および赤色データフレームは、青と赤のカテゴリのすべての勘定に現金が支払われた日付を示しています。私は、アカウントがブルーまたはレッドまたは両方に属しているかどうかに基づいてデータフレームからDFフィールドの後に来るだけの行でDFに新しい行を挿入します。

私はこのようになります探しています出力:出力で

Account  Date   Blue  Red Amount 
     A   1/1/2016  1  0  100  
     A   1/31/2016  1  0  55 
     A   2/1/2016  1  1  200 
     A   2/15/2016  1  1  67 
     A   2/28/2016  1  1  65 
     A   3/15/2016  1  1  77  
     A   3/31/2016  1  1  75 
     B   .............................. 

、2016年1月1日アカウントのようにのみブルーカテゴリに属します。私の目標は、2016年1月31日あるし、それを挿入し表に2016年1月1日直後日付を見つけることです。アカウントAはカテゴリ赤ではないため1/15/2016赤色の表に挿入したくありません。 1/1/2016の時点でです。私は青と赤のフィールドが挿入されたフィールドのNAを表示すると大丈夫です。

私の考えは、rbind(df, blue, red), by="Account")を試していましたが、特定の時点でアカウントが属するカテゴリに基づいて、後日の日付を挿入するだけの条件を組み込む方法はわかりません。

+0

所望の出力が矛盾私見である:あなたが唯一の条件に一致する最初の行を選択df' 'の最初の行について、一方、2列目には2つ以上を含めることができます。以下では、 'blue'と' red'の一致する行から最初の行を選択する解決法を見つけます。 – Jaap

+0

@ProcrastinatusMaximus最初の行(1/1/2016)の時点で、Aはカテゴリーブルーだけなので、1/1と2/1の間にある青色の表から1/31を入れています。 df(2/1/2016)の2行目の時点で、Aは青と赤の両方です。だからこそ私はブルーとレッドのテーブルからすべての日付を持って来ました。 – gibbz00

答えて

1

可能なアプローチ:

# combine the 'blue' & 'red' into one and create an 'colcat' column on the fly 
br <- rbindlist(list(blue, red), 
       idcol = 'colcat')[, colcat := c('blue','red')[colcat]] 

# loop over the rows of 'df', select the needed rows from 'bluered' 
# and punt the result into a list 
brlist <- lapply(df$Date, function(x) br[Date > x][order(Date)]) 

# loop over the rows, select the needed rows from 'bluered' & bind them together 
lst <- lapply(1:nrow(df), function(i) { 
    idx <- c('blue','red')[c(c(1)[!!df[i][['Blue']]], c(2)[!!df[i][['Red']]])] 
    incs <- brlist[[i]][colcat %in% idx][, .SD[1], colcat][, .(Account = df$Account[i], Date, Blue = df$Blue[i], Red = df$Red[i], Amount)] 
    rbind(df[i],incs) 
}) 

# bind the resulting list into one 'data.table' again 
DT <- rbindlist(lst) 

与える:

> DT 
    Account  Date Blue Red Amount 
1:  A 2016-01-01 1 0 100 
2:  A 2016-01-31 1 0  55 
3:  A 2016-02-01 1 1 200 
4:  A 2016-02-15 1 1  67 
5:  A 2016-02-28 1 1  65 
6:  B 2016-01-10 0 1 300 
7:  B 2016-01-15 0 1  47 
8:  B 2016-02-10 1 1 400 
9:  B 2016-02-15 1 1  67 
10:  B 2016-02-28 1 1  65 
+0

ありがとうございました! 3/15/2016および3/31/2016が出力に表示されないのはなぜですか?これは結合された 'br'表にあります。 – gibbz00

関連する問題