2016-11-05 10 views
1

После то, что мои кадры данных выглядят (спасибо хороших правки от опытного сообщества):Dynamic и условная вставка новых строк, которые приходят после определенной даты

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")] 

В первичной dataframe ДФ, Синие и красных полей изображают какую категорию счет принадлежит в данной точке в примере time.for, по состоянию на 1/1/2016, счет а только принадлежит Синих категории. синий и красный данные показывают, с каких дат деньги выдавались всем счетам в синей и красной категории. Я хочу, чтобы вставить новые строки в исходном ФРА только строки, которые приходят после Даты поля в ДФЕ из синего и красного dataframes на основе принадлежит ли учетная запись в синий или красном или оба.

Выход Я ищу выглядит следующим образом:

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   .............................. 

В выходных данных, по состоянию на 1/1/2016 счета А принадлежит только Синих категории. Моя цель найти сразу дату ПОСЛЕ1/1/2016 в голубой таблице, которая 1/31/2016, а затем вставьте его. Я не хочу вставлять 1/15/2016 от красный стол, потому что счет A не является категорией Красный от 1.01.2016. Я в порядке с синими и красными полями, показывающими NA для вставленных полей.

Моя мысль пыталась установить rbind(df, blue, red), by="Account"), но не знает, как включить условия только вставки более поздних дат, основанных на том, к какой категории принадлежит учетная запись в данный момент времени.

+0

Нужный выход противоречива имхо: для первой строки 'df' вы только выбрать первую строку, которая соответствует условиям, в то время как для 2-й строки вы включаете более одного. Ниже вы найдете решение, которое выбирает первую строку из соответствующих строк «blue» и «red». – Jaap

+0

@ProcrastinatusMaximus начиная с первой строки (1/1/2016), A - только категория синий, вот почему я ставлю 1/31 из синего стола, который находится между 1/1 и 2/1. по второй строке в df (2/1/2016), 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

 Смежные вопросы

  • Нет связанных вопросов^_^