Reputation: 15
I have a measurement in every 10-second interval with a date and I need to put a continuous number in one column for the time. Could you please help me to create a loop in R. example data:
MeasureDateTime CO2 H2O
01/03/2021 19:25:57 553 0.6
01/03/2021 19:26:07 553 0.6
01/03/2021 19:26:17 553 0.6
01/03/2021 19:26:27 554 0.6
01/03/2021 20:26:00 556 0.6
01/03/2021 20:26:10 558 0.6
01/03/2021 20:26:20 568 0.6
01/03/2021 20:27:42 584 0.6
01/03/2021 19:27:52 595 0.6
01/03/2021 19:28:02 598 0.6
01/03/2021 19:28:12 599 0.6
01/03/2021 19:28:22 598 0.6
Example how I want
MeasureDateTime CO2 H2O RecordNo
01/03/2021 19:25:57 553 0.6 1
01/03/2021 19:26:07 553 0.6 2
01/03/2021 19:26:17 553 0.6 3
01/03/2021 19:26:27 554 0.6 4
01/03/2021 20:26:00 556 0.6 1
01/03/2021 20:26:10 558 0.6 2
01/03/2021 20:26:20 568 0.6 3
01/03/2021 20:27:42 584 0.6 1
01/03/2021 19:27:52 595 0.6 2
01/03/2021 19:28:02 598 0.6 3
01/03/2021 19:28:12 599 0.6 4
01/03/2021 19:28:22 598 0.6 5
Upvotes: 0
Views: 65
Reputation: 26218
To show that actually it works in scenario as per comments
df <- read.table(text = "MeasureDateTime CO2 H2O
'01/03/2021 19:25:57' 553 0.6
'01/03/2021 19:26:07' 553 0.6
'01/03/2021 19:26:17' 553 0.6
'01/03/2021 19:26:27' 554 0.6
'01/03/2021 20:26:00' 556 0.6
'01/03/2021 20:26:10' 558 0.6
'01/03/2021 20:26:20' 568 0.6
'01/03/2021 20:27:42' 584 0.6
'01/03/2021 19:27:52' 595 0.6
'01/03/2021 19:28:02' 598 0.6
'01/03/2021 19:28:12' 599 0.6
'01/03/2021 19:28:22' 598 0.6
'25/03/2021 23:59:43' 567 0.5
'25/03/2021 23:59:53' 567 0.5
'26/03/2021 00:00:03' 567 0.5
'26/03/2021 00:00:13' 567 0.5
", header = T)
library(dplyr)
df %>%
mutate(MeasureDateTime = as.POSIXct(MeasureDateTime, format = '%d/%m/%Y %H:%M:%S')) %>%
group_by(d = cumsum(c(0,diff.difftime(MeasureDateTime)) != 10)) %>%
mutate(id = row_number()) %>%
ungroup %>%
select(-d)
#> # A tibble: 16 x 4
#> MeasureDateTime CO2 H2O id
#> <dttm> <int> <dbl> <int>
#> 1 2021-03-01 19:25:57 553 0.6 1
#> 2 2021-03-01 19:26:07 553 0.6 2
#> 3 2021-03-01 19:26:17 553 0.6 3
#> 4 2021-03-01 19:26:27 554 0.6 4
#> 5 2021-03-01 20:26:00 556 0.6 1
#> 6 2021-03-01 20:26:10 558 0.6 2
#> 7 2021-03-01 20:26:20 568 0.6 3
#> 8 2021-03-01 20:27:42 584 0.6 1
#> 9 2021-03-01 19:27:52 595 0.6 1
#> 10 2021-03-01 19:28:02 598 0.6 2
#> 11 2021-03-01 19:28:12 599 0.6 3
#> 12 2021-03-01 19:28:22 598 0.6 4
#> 13 2021-03-25 23:59:43 567 0.5 1
#> 14 2021-03-25 23:59:53 567 0.5 2
#> 15 2021-03-26 00:00:03 567 0.5 3
#> 16 2021-03-26 00:00:13 567 0.5 4
Created on 2021-05-04 by the reprex package (v2.0.0)
Alternate answer using only dplyr
df %>%
mutate(MeasureDateTime = as.POSIXct(MeasureDateTime, format = '%d/%m/%Y %H:%M:%S')) %>%
group_by(d = cumsum(c(0,diff.difftime(MeasureDateTime)) != 10)) %>%
mutate(id = row_number()) %>%
ungroup %>%
select(-d)
#> # A tibble: 12 x 4
#> MeasureDateTime CO2 H2O id
#> <dttm> <int> <dbl> <int>
#> 1 2021-03-01 19:25:57 553 0.6 1
#> 2 2021-03-01 19:26:07 553 0.6 2
#> 3 2021-03-01 19:26:17 553 0.6 3
#> 4 2021-03-01 19:26:27 554 0.6 4
#> 5 2021-03-01 20:26:00 556 0.6 1
#> 6 2021-03-01 20:26:10 558 0.6 2
#> 7 2021-03-01 20:26:20 568 0.6 3
#> 8 2021-03-01 20:27:42 584 0.6 1
#> 9 2021-03-01 19:27:52 595 0.6 1
#> 10 2021-03-01 19:28:02 598 0.6 2
#> 11 2021-03-01 19:28:12 599 0.6 3
#> 12 2021-03-01 19:28:22 598 0.6 4
Earlier Answer using purrr
df <- read.table(text = "MeasureDateTime CO2 H2O
'01/03/2021 19:25:57' 553 0.6
'01/03/2021 19:26:07' 553 0.6
'01/03/2021 19:26:17' 553 0.6
'01/03/2021 19:26:27' 554 0.6
'01/03/2021 20:26:00' 556 0.6
'01/03/2021 20:26:10' 558 0.6
'01/03/2021 20:26:20' 568 0.6
'01/03/2021 20:27:42' 584 0.6
'01/03/2021 19:27:52' 595 0.6
'01/03/2021 19:28:02' 598 0.6
'01/03/2021 19:28:12' 599 0.6
'01/03/2021 19:28:22' 598 0.6", header = T)
library(dplyr)
library(purrr)
df %>%
mutate(MeasureDateTime = as.POSIXct(MeasureDateTime, format = '%d/%m/%Y %H:%M:%S')) %>%
mutate(id = +(c(0,diff.difftime(MeasureDateTime)) != 10)) %>%
mutate(id = accumulate(id, ~ifelse(.y == 0, .x + 1, 1)))
#> MeasureDateTime CO2 H2O id
#> 1 2021-03-01 19:25:57 553 0.6 1
#> 2 2021-03-01 19:26:07 553 0.6 2
#> 3 2021-03-01 19:26:17 553 0.6 3
#> 4 2021-03-01 19:26:27 554 0.6 4
#> 5 2021-03-01 20:26:00 556 0.6 1
#> 6 2021-03-01 20:26:10 558 0.6 2
#> 7 2021-03-01 20:26:20 568 0.6 3
#> 8 2021-03-01 20:27:42 584 0.6 1
#> 9 2021-03-01 19:27:52 595 0.6 1
#> 10 2021-03-01 19:28:02 598 0.6 2
#> 11 2021-03-01 19:28:12 599 0.6 3
#> 12 2021-03-01 19:28:22 598 0.6 4
Created on 2021-05-03 by the reprex package (v2.0.0)
Upvotes: 1