我有一个问题,我似乎无法解决。我有一个从 arcgis 中的栅格派生的数据集。该数据集代表了 10 年期间发生的每一次火灾。一些栅格单元在该时间段内发生了多次火灾(因此,我的数据集中将有多行),并且一些栅格单元不会发生任何火灾(因此,不会在我的数据集中表示)。因此,数据集中的每一行都有一个列号(连续整数)和一个分配给它的行号,该行号与栅格中的行和列 ID 相对应。它也有火灾的日期。
我想为fire_ID
彼此相隔 4 天内以及彼此相邻像素(在 8 单元邻域内)的所有火灾分配一个唯一 ID ( ),并将其放入一个新列中。
为了澄清,如果从 2000 年 1 月 1 日第 3 行第 3 列和 2000 年 1 月 4 日第 2 行第 4 列有另一个观察,这些观察将被分配相同的fire_ID
.
下面是一个示例数据集,其中“rows”是栅格的行 ID,“cols”是栅格的列 ID,“dates”是检测到火灾的日期。
rows<-sample(seq(1,50,1),600, replace=TRUE)
cols<-sample(seq(1,50,1),600, replace=TRUE)
dates<-sample(seq(from=as.Date("2000/01/01"), to=as.Date("2000/02/01"), by="day"),600, replace=TRUE)
fire_df<-data.frame(rows, cols, dates)
我尝试按“行”、“列”、“日期”对数据进行排序并循环遍历,如果行和列 ID 在一个值内且日期在 4 天内,则创建一个新的 fire_ID,但这显然不起作用,因为fire_ID
如果列表中它们之间存在属于不同的观察值,则应该为应该分配相同 fire_ID 的火灾分配不同的 s fire_ID
。
fire_df2<-fire_df[order(fire_df$rows, fire_df$cols, fire_df$date),]
fire_ID=numeric(length=nrow(fire_df2))
fire_ID[1]=1
for (i in 2:nrow(fire_df2)){
fire_ID[i]=ifelse(
fire_df2$rows[i]-fire_df2$rows[i-1]<=abs(1) & fire_df2$cols[i]-fire_df2$cols[i-1]<=abs(1) & fire_df2$date[i]-fire_df2$date[i-1]<=abs(4),
fire_ID[i-1],
i)
}
length(unique(fire_ID))
fire_df2$fire_ID<-fire_ID
如果您有任何建议,请告诉我。