R语言 当测量值为零时,通过累加这些差值来计算时间差

rqcrx0a6  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(104)

我有下面的数据框,其中包含id号,读数的日期时间和每次读数的值。

df <- data.frame(encounterId = c(1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026),
chartTime = c("2015-09-16 14:11:00 CEST", "2015-09-16 14:13:00 CEST", "2015-09-16 15:00:00 CEST", "2015-09-16 15:08:00 CEST", "2015-09-16 16:00:00 CEST", "2015-09-16 16:22:00 CEST", "2015-09-16 17:00:00 CEST", "2015-09-16 17:41:00 CEST", "2015-09-16 18:00:00 CEST", "2015-09-16 18:01:00 CEST", "2015-09-16 19:00:00 CEST", "2015-09-16 19:53:00 CEST"),
value = c(2.0, 2.0, 0.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0))

我想计算一下每一行之间的时差。
于是我写道:

df <- df %>%
  group_by(encounterId) %>%
  mutate(time_diff = as.numeric(difftime(lead(chartTime), chartTime), units = 'mins'))

然而,当几个值为零时,我想得到时间差的累积值(例如,序列的第一个零,以及以下零的NA值)。
预期结果将是:
| 遇到ID|chartTime|价值|时差|
| --------------|--------------|--------------|--------------|
| 一零二六|2015-09-16 14:11:00 CEST|二|二|
| 一零二六|2015-09-16 14:13:00 CEST|二|四十七|
| 一零二六|2015-09-16 15:00:00 CEST|0|八|
| 一零二六|2015-09-16 15:08:00 CEST|二|五十二|
| 一零二六|2015-09-16 16:00:00 CEST|二|二十二|
| 一零二六|2015-09-16 16:22:00 CEST|0|九九|
| 一零二六|2015-09-16 17:00:00 CEST|0|不适用|
| 一零二六|2015-09-16 17:41:00 CEST|0|不适用|
| 一零二六|2015-09-16 18:00:00 CEST|0|不适用|
| 一零二六|2015-09-16 18:01:00 CEST|二|五十九|
| 一零二六|2015-09-16 19:00:00 CEST|二|五十三|
| 一零二六|2015-09-16 19:53:00 CEST|二||
我已经尝试了几种方法,但都没有找到解决方案。显然,我宁愿不使用循环(for i in 1:nrow()),因为我的dataframe有超过10亿行,这将是时间膨胀!
我想感谢社区在这件事上的帮助。

k4emjkb1

k4emjkb11#

我们可以先删除重复的0,计算time_diff,然后附加重复的0。

library(dplyr)

df2 <- df %>% 
  mutate(id = consecutive_id(value)) 

df2[df2$value!=0 | !duplicated(df2$id),]%>%
  group_by(encounterId) %>%
  mutate(time_diff = as.numeric(difftime(lead(chartTime), chartTime), units = 'mins')) %>%
  bind_rows(df2[df2$value==0 & duplicated(df2$id),]) %>% 
  arrange(encounterId, chartTime) %>%
  select(-id) %>%
  ungroup()

# A tibble: 12 × 4
   encounterId chartTime                value time_diff
         <dbl> <chr>                    <dbl>     <dbl>
 1        1026 2015-09-16 14:11:00 CEST     2         2
 2        1026 2015-09-16 14:13:00 CEST     2        47
 3        1026 2015-09-16 15:00:00 CEST     0         8
 4        1026 2015-09-16 15:08:00 CEST     2        52
 5        1026 2015-09-16 16:00:00 CEST     2        22
 6        1026 2015-09-16 16:22:00 CEST     0        99
 7        1026 2015-09-16 17:00:00 CEST     0        NA
 8        1026 2015-09-16 17:41:00 CEST     0        NA
 9        1026 2015-09-16 18:00:00 CEST     0        NA
10        1026 2015-09-16 18:01:00 CEST     2        59
11        1026 2015-09-16 19:00:00 CEST     2        53
12        1026 2015-09-16 19:53:00 CEST     2        NA

相关问题