R - l适用于两列参数



这些是我的dataframe

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)

可以使用apply:

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

这可能不是真正的数据框架传统,但我认为如果你来自base-R背景,逻辑是相当清楚的。数据。表"["函数需要在列表中有未加引号的列名来传递列值:

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

创建一个向量,检查ab的行是否符合您的条件,然后使用它来选择ab的行。

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

最新更新