2016-11-05 3 views
2

Это мое dataframeslapply с двумя аргументами столбцов

library(data.table) 
df <- fread(' 
      Account  Date  NextDate 
      A   2016-01-01  2016-02-01 
      A   2016-02-01  2016-11-05 
      B   2016-03-10  2016-11-05') 


ab <- fread(' 
     Date  Amount 
    2015-06-01  55 
    2016-01-31  55 
    2016-02-28  65 
    2016-03-31  75') 

Я хочу, чтобы создать список, делая петлю в каждых строках в df и выбрать все строки из ab где ab$Date больше df$Date и меньше df$NextDate так что результат выглядит следующим образом:

[[1]] 

Date  Amount 
2016-01-31 55 

[[2]] 

Date  Amount 
2016-02-28 65 
2016-03-31 75 

[[3]] 
Date  Amount 
2016-03-31 75 

Это моя попытка:

list<- lapply(df$Date, function(x,y) br[Date > x & Date < y ],y=df$NextDate) 

ответ

1

Создайте вектор, который проверяет, соответствуют ли строки ab вашим условиям, затем используйте его для выбора строк ab.

lapply(1:nrow(df), function(x) { 
    ab[which(ab$Date > df[x, get("Date")] & ab$Date < df[x, get("NextDate")]), ] 
}) 
+0

Спасибо за ваш ответ! – gibbz00

+0

Добро пожаловать. Вы можете поблагодарить меня лучше, выбирая мой ответ! – rsoren

2

Возможно, это на самом деле не в dataframe традиции, но я думаю, что логика довольно ясно, если вы едете из фона базы-R. Data.table «[» функция должна иметь некотируемые имена столбцов в списке delive только значения столбцов:

apply(df[, list(Date,NextDate)] , 1, 
     function(dts) ab[ ab$Date > dts['Date'] & ab$Date < dts['NextDate'], ]) 
[[1]] 
     Date Amount 
1: 2016-01-31  55 

[[2]] 
     Date Amount 
1: 2016-02-28  65 
2: 2016-03-31  75 

[[3]] 
     Date Amount 
1: 2016-03-31  75 
+0

Спасибо за ваш ответ! – gibbz00

2

Вы можете использовать применять:

apply(df, 1, function(x) ab[ab$Date>x[2] & ab$Date<x[3],]) 
+0

Спасибо за ваш ответ! – gibbz00