【问题标题】:lapply with two column argumentslapply 带有两个列参数
【发布时间】:2016-11-05 23:40:14
【问题描述】:

这些是我的数据框

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)

【问题讨论】:

    标签: r data.table lapply


    【解决方案1】:

    这可能不是真正的数据框传统,但我认为如果您来自 base-R 背景,逻辑是相当清楚的。 data.table "[" 函数需要在列表中包含不带引号的列名才能仅传递列值:

    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
    

    【讨论】:

      【解决方案2】:

      你可以使用申请:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 不客气。您可以通过投票和选择我的答案来更好地感谢我!
        猜你喜欢
        • 2019-09-10
        • 1970-01-01
        • 2018-10-23
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多