Изчислете продължителността в R

Чудя се дали има лесен начин за изчисляване на продължителността. Имам набор от данни, където параметърът a, наречен m, варира между стойностите -1 и 1 през времето. Искам да изчисля:

  1. Общата продължителност (време в часове) на случаите, при които m=-1 и m=1 съответно
  2. Колко дълъг е всеки период от случаи, където е съответно m=-1 и m=1

    m<-c(1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1)

    Време ‹- seq.POSIXt(as.POSIXct(Sys.Date()), as.POSIXct(Sys.Date()+1), by = "1 час")


person user4631839    schedule 12.03.2015    source източник
comment
Определено е възможно. Можете ли да дадете извадка от вашите данни, за да можем да ви помогнем с това?   -  person Dominic Comtois    schedule 12.03.2015
comment
Преобразували ли сте вашата променлива Time в правилен формат, напр. df$Time <- as.POSIXct(df$Time) ? Когато е готово - можете просто да извадите времеви променливи, за да получите difftime.   -  person statespace    schedule 12.03.2015
comment
Добавете възпроизводими примерни данни към вашия въпрос.   -  person zx8754    schedule 12.03.2015
comment
Опитах се да добавя проба, добре ли е, както го направих? Толкова много за научаване...   -  person user4631839    schedule 13.03.2015


Отговори (1)


Бих използвал пакет data.table за „split-apply-combine“ и бих идентифицирал изпълненията с помощта на cumsum и diff:

DF <- read.table(text="Time,    m
2015-01-01 00:00,    -1
2015-01-01 01:00,    -1
2015-01-01 02:00,    -1
2015-01-01 03:00,    1
2015-01-01 04:00,    1
2015-01-01 05:00,    1
2015-01-01 06:00,    1
2015-01-01 07:00,    1
2015-01-01 08:00,    -1
2015-01-01 09:00,    -1
2015-01-01 10:00,    -1
2015-01-01 11:00,    -1
2015-01-01 12:00,    1
2015-01-01 13:00,    1
2015-01-01 14:00,    1
2015-01-01 15:00,    -1", header = TRUE, sep =",")

library(data.table)
setDT(DF)
DF[, Time := as.POSIXct(Time, format = "%Y-%m-%d %H:%M", tz = "GMT")]
DF[, run := cumsum(c(1, diff(m) != 0))]

DF1 <- DF[, list(m = unique(m), 
                 duration = difftime(max(Time), min(Time), unit = "min")), 
          by = run]
#   run  m duration
#1:   1 -1 120 mins
#2:   2  1 240 mins
#3:   3 -1 180 mins
#4:   4  1 120 mins
#5:   5 -1   0 mins

DF1[, sum(duration), by = m]
#    m  V1
#1: -1 300
#2:  1 360
person Roland    schedule 12.03.2015
comment
Страхотен! Отне ми време да разбера това. Сега проучих повече за пакета data.table и мисля, че разбирам. Въпреки това бих изчислил кумулативното време съответно на m=1 и m=-1, но не мога да разбера как да го направя. Имаш ли някакви предложения? - person user4631839; 30.04.2015