gpt4 book ai didi

r - 我们如何使用 R 中 data.table 组中的最后一行进行一些计算?

转载 作者:行者123 更新时间:2023-12-01 08:26:54 25 4
gpt4 key购买 nike

我有这个data.table:

样本:

id cond date
1 A1 2012-11-19
1 A1 2013-05-09
1 A2 2014-09-05
2 B1 2015-03-05
2 B1 2015-07-06
3 A1 2015-02-05
4 B1 2012-09-26
4 B1 2015-02-05
5 B1 2012-09-26

我想从今天的日期开始计算每组“id”和“cond”中的逾期天数,所以我试图获取每组中最后一个日期与 sys.date 之间的天数差异。期望的输出是 ;

id cond date        overdue
1 A1 2012-11-19 NA
1 A1 2013-05-09 832
1 A2 2014-09-05 348
2 B1 2015-03-05 NA
2 B1 2015-07-06 44
3 A1 2015-02-05 195
4 B1 2012-09-26 NA
4 B1 2015-02-05 195
5 B1 2012-09-26 1057

我尝试通过以下代码实现这一点:

sample <- sample[ , overdue := Sys.Date() - date[.N], by = c('id','cond')]

但我得到以下输出,其中值正在回收:

id cond date        overdue
1 A1 2012-11-19 832
1 A1 2013-05-09 832
1 A2 2014-09-05 348
2 B1 2015-03-05 44
2 B1 2015-07-06 44
3 A1 2015-02-05 195
4 B1 2012-09-26 195
4 B1 2015-02-05 195
5 B1 2012-09-26 1057

我不确定,如何限制我的代码只计算最后一行而不回收。我相信会有办法做到这一点,不胜感激。

最佳答案

您可以制作过期值及其所属行的表格:

bycols    = c("id","cond")
newcolDT2 = DT[, Sys.Date() - date[.N], by = bycols]

DT[newcolDT2, overdue := V1, on = bycols, mult = "last"]
# id cond date overdue
# 1: 1 A1 2012-11-19 NA days
# 2: 1 A1 2013-05-09 832 days
# 3: 1 A2 2014-09-05 348 days
# 4: 2 B1 2015-03-05 NA days
# 5: 2 B1 2015-07-06 44 days
# 6: 3 A1 2015-02-05 195 days
# 7: 4 B1 2012-09-26 NA days
# 8: 4 B1 2015-02-05 195 days
# 9: 5 B1 2012-09-26 1057 days

这是(可以说是丑陋的)单行版本:

DT[J(unique(DT[, ..bycols])), 
overdue := Sys.Date() - date, on = bycols, mult = "last"]

数据:

DT <- data.table(read.table(header=TRUE,text="id cond date
1 A1 2012-11-19
1 A1 2013-05-09
1 A2 2014-09-05
2 B1 2015-03-05
2 B1 2015-07-06
3 A1 2015-02-05
4 B1 2012-09-26
4 B1 2015-02-05
5 B1 2012-09-26"))[, date := as.IDate(date)]

# anyone know how to do this with fread()?

关于r - 我们如何使用 R 中 data.table 组中的最后一行进行一些计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32101368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com