我想计算出事情发生后的时间。
鉴于以下情况,您可以看到灯光在某些时间亮起,但并非始终如此。我想规范化数据以将其提供给神经网络。
library(data.table)
d<-data.table(
date = c("6/1/2013", "6/2/2013","6/3/2013","6/4/2013"),
light = c(TRUE,FALSE,FALSE,TRUE)
)
d
date light
1: 6/1/2013 TRUE
2: 6/2/2013 FALSE
3: 6/3/2013 FALSE
4: 6/4/2013 TRUE
我想要计算的是另一列显示与最后一次出现的“距离”。
所以对于上面的数据: 第一行,因为它上面应该为零 第二排,应为1 第三排,应该是2 第四行,应为零
答案 0 :(得分:5)
我建议根据何时从FALSE切换到TRUE来创建分组列:
# create group column
d[c(light), group := cumsum(light)]
d[is.na(group), group:=0L]
d[, group := cumsum(group)]
d
然后只需按小组统一,使用cumsum
并否定light
:
d[, distance := cumsum(!light), by=group]
# remove the group column for cleanliness
d[, group := NULL]
d
date light distance
1: 2013-06-01 TRUE 0
2: 2013-06-02 FALSE 1
3: 2013-06-03 FALSE 2
4: 2013-06-04 TRUE 0
5: 2013-06-05 TRUE 0
6: 2013-06-06 FALSE 1
7: 2013-06-07 FALSE 2
8: 2013-06-08 TRUE 0
我添加了几行
答案 1 :(得分:4)
这应该这样做:
d[, distance := 1:.N - 1, by = cumsum(light)]
或者这个:
d[, distance := .I - .I[1], by = cumsum(light)]
如果你想实际计算天数而不是行距,你可以使用:
d[, distance := as.numeric(as.POSIXct(date, format = "%m/%d/%Y") -
as.POSIXct(date[1], format = "%m/%d/%Y"),
units = 'days'),
by = cumsum(light)]
答案 2 :(得分:2)
使用行程编码(rle
)和sequence
(unlist(lapply(nvec, seq_len))
的包装器
d[, distance := sequence(rle(light)$lengths)][(light), distance := 0]