【发布时间】:2021-06-23 14:47:53
【问题描述】:
调查和火灾在不同的燃烧单位不定期发生。 (srv=1 表示调查完成,fire=1 表示发生火灾) 我想计算两次调查之间点燃了多少火,即 包括调查年份和上一次调查前一年。
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
我可以计算经过的年数,但我必须创建一个新数据集,然后将其加入原始数据集。然后我无法弄清楚日期范围之间的火灾总和。
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”,否则它提供上次调查后的火灾数量,包括当前调查年份:
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
【问题讨论】:
-
给定这个随机数据的输出是什么?
-
我编辑了问题以包含输出数据,谢谢
-
您说要计算一个调查年度(含)到上一个调查年度前一年之间的火灾次数。查看 2002 年 1 年的单元,2002 年发生火灾,2000 年发生火灾,对我来说,这表明您的答案中的
nfire[3]应该是 2,而不是 1。 -
我将 2002 年调查年的火灾 (=1) 添加到 2001 年调查年 (=0) 的火灾中,以达到 nfire=1
-
为什么不是单位 1 年 2000
nfire = 1?为什么单位 1 年 2003nfire = 1?我认为您的elapsed字段在这里是一个红鲱鱼......我认为DT[, grp := rev(cumsum(rev(srv == 1))), by = .(unit)][, nfire := sum(fire), by=.(unit, grp)]很接近或一个好的开始,但总和是不同的。
标签: r data.table