【问题标题】:Generate id for durations with dplyr使用 dplyr 为持续时间生成 id
【发布时间】:2022-01-16 22:52:10
【问题描述】:

我有一列包含日期(时间),我认为一个持续时间是 1 秒的连续时间:

data <- data.frame(Time = c("2021-12-01 01:01:01","2021-12-01 01:01:02","2021-12-01 01:01:03","2021-12-01 01:01:05","2021-12-01 01:01:06"))

我想为每个持续时间生成一个 ID,如下所示:

data <- data.frame(Time = c("2021-12-01 01:01:01","2021-12-01 01:01:02","2021-12-01 01:01:03","2021-12-01 01:01:05","2021-12-01 01:01:06"),Id = c(1,1,1,2,2))

使用 dplyr... 谢谢

【问题讨论】:

  • 你能举个例子'我认为一个持续时间是1s的连续时间'
  • 首先确保有真正的时间戳,而不是字符串。您需要使用 as.POSIXct(或可选的几个旨在提供帮助的软件包之一)才能转换为您需要的 POSIXt 类。

标签: r dplyr


【解决方案1】:

前期:

cumsum(c(TRUE, as.numeric(diff(as.POSIXct(data$Time)), units = "secs") > 1L))
# [1] 1 1 1 2 2

首先,您应该真正使用真正的时间戳,而不是字符串。如果您要对 Time 字段进行其他操作,几乎可以肯定这将是一个类似数字的操作,因此您应该预先使用

data$Time <- as.POSIXct(data$Time)

这很容易在这里工作,因为它们按照"%Y-%m-%d %H:%M:%S"的默认格式格式正确;有关% 代码,请参见?strptime

从这里开始,您想要跟踪时间差何时超过 1 秒。区分很容易:

as.numeric(diff(data$Time), units = "secs")
# [1] 1 1 2 1

确实,关键操作员是diff,但如果数据间隔足够大,它可以报告分钟或小时等;有一个内部启发式。将其包裹在 as.numeric(., units="secs") 中会强制它始终以秒为单位。

从这里开始,我们需要它大于 1 时的累积和,即&gt; 1L,所以cumsum(. &gt; 1L)

请注意,我们的输入长度为 5,但输出长度为 4,因此意识到 差异 在两个元素之间是有意义的。我们强制第一个差异测试为TRUE。如果你后来改成POSIXt-class,那么原代码会稍微缩减为

cumsum(c(TRUE, as.numeric(diff(data$Time), units = "secs") > 1L))

因此将其存储为Id

data$Id <- cumsum(c(TRUE, as.numeric(diff(data$Time), units = "secs") > 1L))

【讨论】:

  • 非常感谢。
  • @r2evans 精湛
  • TristanLorino,因为您是新手:当您的问题得到解答时,请accept it。这里并不着急,如果您觉得它可能会为您的需求得到一个“更优雅”的答案,那么将它打开一两天可能是一种常见的策略;但是,请记得回来(一到三天?)接受它。 (当有多个答案时,您只能接受其中一个,但一旦您获得 15 个或更多代表点数,您就可以对任何或所有您认为值得的答案进行投票。)谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多