6

我想计算自某事发生以来已有多长时间。

鉴于以下情况,您可以看到灯在某些时候亮着,但不是一直亮着。我想规范化数据以将其提供给神经网络。

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 第四行,应该是零

4

3 回答 3

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

我添加了几行

于 2013-07-08T03:29:30.663 回答
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)]
于 2013-07-08T18:09:01.763 回答
2

一种使用游程编码 ( rle) 和sequence( 它是unlist(lapply(nvec, seq_len))

d[, distance := sequence(rle(light)$lengths)][(light), distance := 0]
于 2013-07-08T04:48:17.147 回答