расчет длины эпизодов / событий с использованием R - PullRequest
3 голосов
/ 05 февраля 2012

Мне просто интересно, сможет ли кто-нибудь посоветовать мне, как мне подойти к следующему вычислению с r, пожалуйста?

У меня есть почасовой набор данных за год с 3 столбцами: "datetime» и «values»

, например:

'01/01/2000'     '08:00'     '10'     
'01/01/2000'     '09:00'     '30'
'01/01/2000'     '10:00'     '43'
'01/01/2000'     '11:00'     '55'
'01/01/2000'     '12:00'     '59'
'01/01/2000'     '13:00'     '45'
'01/01/2000'     '14:00'     '10'
'01/01/2000'     '15:00'     '15'
'01/01/2000'     '16:00'     '43'
'01/01/2000'     '17:00'     '45'
'01/01/2000'     '18:00'     '60'
'01/01/2000'     '19:00'     '10'

Я хотел бы создать data.frame, который бы рассчитывал длину эпизодов со значениями> 40,и, если возможно, покажите его с датой и временем начала, например, из вышеприведенной таблицы 1-й случай превышения - в 10:00 для продолжительности 4 часа, 2-й случай - в 16:00 для продолжительности 3 часа, поэтомуМне интересно, возможно ли создать фрейм данных, как показано ниже?

     'date'      'time'    'Duration'  
'01/01/2000'     '10:00'       '4'
'01/01/2000'     '16:00'       '3'

и т. Д. Для годового набора данных

Ответы [ 3 ]

4 голосов
/ 05 февраля 2012

Вот еще одно решение, основанное на plyr: оно облегчает вычисление других величин для каждого заклинания с значениями выше 40, например, среднее или максимальное.значения выше 40 могут охватывать несколько дней: это может или не может быть тем, что вы хотите.

3 голосов
/ 05 февраля 2012

Другой вариант:

dat <- structure(list(date = c("01/01/2000", "01/01/2000", "01/01/2000", 
  "01/01/2000", "01/01/2000", "01/01/2000", "01/01/2000", "01/01/2000", 
  "01/01/2000", "01/01/2000", "01/01/2000", "01/01/2000"), 
  time = c("08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", 
  "15:00", "16:00", "17:00", "18:00", "19:00"), value = c("10", "30", "43", 
  "55", "59", "45", "10", "15", "43", "45", "60", "10")), 
  .Names = c("date", "time", "values"), row.names = c(NA, -12L), 
  class = "data.frame")

run <- rle(dat$value > 40)
dat$exceeds <- rep(run$values, run$lengths)
dat$duration <- rep(run$lengths, run$lengths)
starts <- dat[head(c(1, cumsum(run$length) + 1), length(run$length)),]
result <- subset(starts, duration > 1 & exceeds)

result[, c(1, 2, 5)]

        date  time duration
3 01/01/2000 10:00        4
9 01/01/2000 16:00        3
2 голосов
/ 05 февраля 2012

НЕКОТОРЫЕ ДАННЫЕ

txt <- "'01/01/2000'     '08:00'     '10'     
'01/01/2000'     '09:00'     '30'
'01/01/2000'     '10:00'     '43'
'01/01/2000'     '11:00'     '55'
'01/01/2000'     '12:00'     '59'
'01/01/2000'     '13:00'     '45'
'01/01/2000'     '14:00'     '10'
'01/01/2000'     '15:00'     '15'
'01/01/2000'     '16:00'     '43'
'01/01/2000'     '17:00'     '45'
'01/01/2000'     '18:00'     '60'
'01/01/2000'     '19:00'     '10'"

tc <- textConnection(txt)

data <- read.table(tc,header=FALSE,as.is=TRUE)

FUNCTION

fun <- function(data,cutoff=40){
 data_above <- 1L*(data$V3>cutoff)
 id_start <- which(diff(c(0L,data_above))==1)
 id_end <- which(diff(c(data_above,0L))== -1)
 res <- cbind(data[id_start,1:2],Duration=id_end-id_start+1)
 return(res)
}

РЕЗУЛЬТАТЫ

fun(data)

          V1    V2 Duration
3 01/01/2000 10:00        4
9 01/01/2000 16:00        3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...