Rajan Dhakal
Rajan Dhakal

Reputation: 15

How to write loop for time and give a number

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

Answers (1)

AnilGoyal
AnilGoyal

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

Related Questions