Я работаю в R на фрейме данных, состоящем из данных времени и осадков (более 3 000 000 значений, измеряемых каждую минуту)
Я хотел бы извлечь все "эпизоды осадков", которые фактически являются всеми моментамикогда шел дождь (dp! = 0, но также включая возможный перерыв в дожде, но не больше, чем «a» следующих измерений)
Я бы хотел, чтобы все эпизоды были сохранены в новом фрейме данных с дополнительнымистолбец с номером каждого из них.Первый дождь - 1, Второй - 2 ....
Пример "эпизода осадков":
time <- c("2013-01-01 11:39:00",
"2013-01-01 11:40:00", "2013-01-01 11:41:00",
"2013-01-01 11:42:00","2013-01-01 11:43:00",
"2013-01-01 11:44:00","2013-01-01 11:45:00",
"2013-01-01 11:46:00","2013-01-01 11:47:00",
"2013-01-01 11:48:00","2013-01-01 11:49:00",
"2013-01-01 11:50:00","2013-01-01 11:51:00",
"2013-01-01 11:52:00","2013-01-01 11:53:00")
time <- as.POSIXct(time , origin="1899-12-30",tz="GMT")
p<- c(1.565, 1.565, 1.658, 1.795, 1.795, 1.795, 1.896, 1.896, 2.985, 2.985,
2.985, 2.985, 3.5, 3.7, 3.85)
df <- data.frame(time, p)
dp <- diff(df$p)
df$dp<- c(dp,0)
Я создал функцию, используя цикл for и (много) условия ifчто, я надеюсь, хорошо отражает мои намерения.В настоящее время он не работает должным образом - все еще ищет причину.
rain.episodes<- function(x) {
a<- 300
episode.number <- 1
rain <- reja.clean[1,] #just for column names
for (i in 1:nrow(x)) {
if (x[i,"dp"] >0) {
rain[i,]<- x[i,]
rain[i, "episode.number"]<- episode.number
a<-0
} else if (x[i,"dp"] ==0 & a<300) {
rain[i,]<- x[i,]
rain[i, "episode.number"]<- episode.number
a<-a+1
} else if (a==301) {
episode.number<-episode.number+1
} else{
a<-a+1
}
}
return(rain)
}
Есть ли способ создать функцию, помогающую мне в этой проблеме, с тем же выводом, что и я вставил, но с использованием другого (лучше) метод?
Я также хотел бы знать, почему моя функция не работает.