【问题标题】:difftime in R dataframe based on subset基于子集的R数据帧中的difftime
【发布时间】:2016-05-19 13:45:34
【问题描述】:

我有这个示例数据框,它记录了灯打开和关闭的时间。

                  time lamp status
1  2015-01-01 12:18:17    2     ON
2  2015-01-01 13:07:29   28     ON
3  2015-01-01 13:11:50   28    OFF
4  2015-01-01 13:18:28    2    OFF
5  2015-01-01 14:07:29   28     ON
6  2015-01-01 14:11:35   28    OFF
7  2015-01-01 14:18:28    2     ON
5  2015-01-01 14:18:57    2    OFF

我想要实现的是添加第四列,其中包含打开灯的持续时间(以秒为单位)。

想要的输出:

                  time lamp status duration
1  2015-01-01 12:18:17    2     ON     3611
2  2015-01-01 13:07:29   28     ON      261
3  2015-01-01 13:11:50   28    OFF       NA  
4  2015-01-01 13:18:28    2    OFF       NA
5  2015-01-01 14:07:29   28     ON      246
6  2015-01-01 14:11:35   28    OFF       NA
7  2015-01-01 14:18:28    2     ON       29
5  2015-01-01 14:18:57    2    OFF       NA

我已经使用自定义函数成功地做到了这一点,包括 while 和 for 循环。但... 我是 R 的初学者,我很确定这可以做得更简单和优雅(使用子集、应用和/或....)。我就是不知道怎么弄?

有什么想法,有正确方向的线索吗?

【问题讨论】:

  • 您的“时间”列是 Posix 格式吗?
  • @agenis:是的。
  • 好的,谢谢。我刚刚修改了我的答案

标签: r dataframe subset difftime


【解决方案1】:

这对我有用:

library(dplyr)
df <- df %>% mutate(sec=as.numeric(time)) %>% group_by(lamp) %>% mutate(duration=c(diff(sec), NA)) %>% select(-sec)
df$duration[df$status=="OFF"] <- NA
#### 1 2015-01-01 12:18:17     2     ON     3611
#### 2 2015-01-01 13:07:29    28     ON      261
#### 3 2015-01-01 13:11:50    28    OFF       NA

您的数据:

df=structure(list(time = structure(c(1420111097, 1420114049, 1420114310, 
1420114708, 1420117649, 1420117895, 1420118308, 1420118337), class = c("POSIXct", 
"POSIXt"), tzone = ""), lamp = c(2L, 28L, 28L, 2L, 28L, 28L, 
2L, 2L), status = structure(c(2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L), .Label = c("OFF", 
"ON"), class = "factor"), duration = c(2952, 261, NA, NA, 246, 
NA, 29, NA)), .Names = c("time", "lamp", "status", "duration"
), row.names = c(NA, -8L), class = "data.frame")

【讨论】:

  • 是的,它允许您在一行中执行许多数据操作,并执行良好的组计算。相当“上瘾”
猜你喜欢
  • 2018-07-08
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多