首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Data.table:不规则日期范围之间的总和

Data.table:不规则日期范围之间的总和
EN

Stack Overflow用户
提问于 2021-03-27 02:37:26
回答 1查看 66关注 0票数 0

调查和火灾在不同的烧伤单位以不规则的时间间隔发生。(srv=1表示进行了调查,fire=1表示发生了火灾)我想计算两次调查之间发生了多少火灾,即包括调查的年份和上一次调查之前的一年。

代码语言:javascript
运行
复制
nyear = 10
units = 4
set.seed(15)

DT <- data.table(
        unit = rep(1:units, each=nyear), 
        year = 2000:(2000+nyear-1), 
        srv = rbinom(nyear*units, 1, 0.4),
        fire = rbinom(nyear*units, 1, 0.3)
    )
DT

我可以计算经过的年数,但我必须创建一个新的数据集,然后将其连接回原始数据集。那么我就不能计算出日期范围之间的火灾总和。

代码语言:javascript
运行
复制
DT1 <- DT[srv != 0]             # Drop years without surveys
DT2 <- DT1[, .(year, elapsed = year - shift(year)), by = "unit"] # Use 'shift' to find years elapsed
DT3 <- DT2[DT, on=.(unit, year)]    # join dataset with elapsed time to original dataset
DT3[ , sum(fire), on = .(year >= year, year < year -(elapsed-1)), by="unit"] # Doesn't work

示例输出如下,其中'nfire‘是我想要的--在没有调查的年份,它是'NA',否则它提供了上次调查之后的火灾数量,包括当前调查年份:

代码语言:javascript
运行
复制
    unit year elapsed srv fire  nfire
 1:    1 2000      NA   1    1  1
 2:    1 2001      NA   0    0  NA
 3:    1 2002       2   1    1  1
 4:    1 2003       1   1    0  0
 5:    1 2004      NA   0    0  NA
 6:    1 2005       2   1    0  0
 7:    1 2006       1   1    0  1
 8:    1 2007      NA   0    1  NA
 9:    1 2008       2   1    1  2
10:    1 2009       1   1    0  1
11:    2 2000      NA   0    0  NA
12:    2 2001      NA   1    1  NA
EN

回答 1

Stack Overflow用户

发布于 2021-04-02 01:18:08

r2evans的答案是有效的:

代码语言:javascript
运行
复制
DT[, grp := rev(cumsum(rev(srv == 1))), by = .(unit)][, nfire := sum(fire), by=.(unit, grp)] 

调查发生的时间(srv、==1)按相反顺序排列,然后累加。反向排序确保将每个调查与其之前的年份分组,并且累积求和提供了一个连续编号的组的列表。外部“rev”将订单更改回其原始组织。

语句的第二部分',nfire := sum(by=),unit.(unit,grp)‘是一个链接的例子--据我所知,这只是在data.table步骤中引入更多操作的一种方式,而不会弄乱语句的第一部分。其中的语法相当直观。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66822601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档