【问题标题】:choose semi-last observations based on date in data.table in R根据 R 中 data.table 中的日期选择半最后的观察结果
【发布时间】:2020-09-06 07:17:19
【问题描述】:

我有一个 data.table,其中包含日期(作为因子变量)。我从这些中得到滞后值。我怎样才能告诉 R 运行获取滞后值仅用于日期为半最后的观察?在这种情况下,这将是 start == "01.01.2015"?

示例数据:

ID <- rep("A5", 15)
product <- rep(c("prod1","prod2","prod3", "prod55", "prod4", "prod9", "prod83"),3)
start <- c(rep("01.01.2016", 3), rep("01.01.2015", 3), rep("01.01.2014",3),
           rep("01.01.2013",3), rep("01.01.2012",3))
prodID <- c(3,1,2,3,1,2,3,1,2,3,2,1,3,1,2)
mydata <- cbind(ID, product[1:15], start, prodID)
mydata <- as.data.table(mydata)

mydata[, (nameCols) := shift(.SD, 3, fill = "NA", "lead"), .SDcols= c("start", "V2"), by = "prodID"]

现在我已经使用它来获得我的结果:

mydata[start == "01.01.2015"]

问题是半最后日期并不总是相同的日期。我将多次重复此过程,并且我希望避免手动指定此过程。有什么想法吗?

【问题讨论】:

    标签: r date data.table lag


    【解决方案1】:

    将数据转换为日期对象和sort 以选择半最后日期。

    library(data.table)
    
    mydata[, start := as.IDate(start, '%d.%m.%Y')]
    mydata[start == sort(unique(start), decreasing = TRUE)[2]]
    
    
    #   ID     V2      start prodID
    #1: A5 prod55 2015-01-01      3
    #2: A5  prod4 2015-01-01      1
    #3: A5  prod9 2015-01-01      2
    

    【讨论】:

    • 可以避免重新格式化从 01.01.2015 到 2015-01-01 的日期吗?
    • 如果您不运行IDate 步骤,您仍将获得相同的输出,避免转换。但是,在这种情况下,我们只比较字符串。它不知道start 实际上是日期,您可以使用format 以您喜欢的格式取回数据。
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2020-11-11
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多