【问题标题】:R how to identify distance of last occurrenceR如何识别最后一次出现的距离
【发布时间】:2013-07-08 03:05:44
【问题描述】:

我想计算距离某事发生的时间。

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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我建议根据从 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
    

    我添加了几行

    【讨论】:

    • 为什么要推荐其他看似简单的解决方案?这是一个完美的考虑吗?在某些方面更正确?
    • 不,我是如何想到解决这个问题的。就个人而言,我喜欢@eddi 的解决方案
    【解决方案2】:

    应该这样做:

    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)]
    

    【讨论】:

      【解决方案3】:

      一种使用游程编码 (rle) 和 sequence(它是 unlist(lapply(nvec, seq_len)) 的包装器)的方法

      d[, distance := sequence(rle(light)$lengths)][(light), distance := 0]
      

      【讨论】:

      • 或者:d[, distance := ifelse(light, 0, sequence(rle(light)$lengths))]
      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多