【问题标题】:Assign trip number based on condition根据条件分配行程编号
【发布时间】:2019-08-15 17:16:57
【问题描述】:

我有一个时间序列数据。我想在“soak”> 3600列时对行进行分组和编号。当soak > 3600时的第一行编号为1,连续的行也编号为1,直到另一行满足soak > 3600的条件。然后那行和后续行编号为 2,直到第三次出现浸泡 > 3600。

还提供了我的数据的小样本和我尝试过的代码。

我的代码进行了计数,但似乎使用 ave() 给了我一些十进制数...有没有办法输出整数?

starts <- structure(list(datetime = structure(c(1440578907, 1440579205, 
1440579832, 1440579885, 1440579926, 1440579977, 1440580044, 1440580106, 
1440580195, 1440580256, 1440580366, 1440580410, 1440580476, 1440580529, 
1440580931, 1440580966, 1440587753, 1440587913, 1440587933, 1440587954
), class = c("POSIXct", "POSIXt"), tzone = ""), soak = c(NA, 
70L, 578L, 21L, 2L, 41L, 14L, 16L, 32L, 9L, 45L, 20L, 51L, 25L, 
364L, 4L, 6764L, 20L, 4L, 5L)), row.names = c(NA, -20L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x000000000a4d1ef0>)

starts$trip <- with(starts, ave(tdiff, cumsum(replace(soka, NA, 10000) > 3600)))

【问题讨论】:

  • 你想要starts[, trip := cumsum(ifelse(is.na(soak), 0, soak &gt; 3600))]吗? (如果没有,请提供所需的输出)
  • @IceCreamToucan 我修改为starts[, trip := cumsum(ifelse(is.na(soak), 1, soap > 3600))] 然后得到我想要的结果...

标签: r count dplyr data.table cumsum


【解决方案1】:

使用 dplyr

library(dplyr)
starts %>% mutate(trip = cumsum(replace(soak, is.na(soak), 1) > 3600))

并带有基础 R

starts$trip = with(starts, ave(soak, FUN=function(x) cumsum(replace(x, is.na(x), 1) > 3600)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多