Предполагая, что вы читаете данные в файле .csv
в виде рамки df
данных, один подход к вашей проблеме заключается в использовании rollapply
из zoo
пакета, чтобы дать вам качение суммы:
library(zoo)
ind_keep <- seq(1,floor(nrow(df)/5)*5, by=5) ## 1.
out <- sapply(df[,-1], function(x) rollapply(x,6,sum)) ## 2.
out <- data.frame(df[ind_keep+5,1],out[ind_keep,]) ## 3.
colnames(out) <- c("Day_and_time","Rain1_mm/5min","Rain2_mm/5min") ## 4.
Примечания:
- Здесь мы определяем индексы, соответствующие каждые 5 минут, где мы хотим сохранить текущую сумму в течение следующих 5 минут.
- Примените функцию скользящей суммы для каждого столбца.
- Используйте
sapply
по всем столбцам df
, который не является первым столбцом. Обратите внимание, что индексы столбцов, указанные в df[,-1]
, могут быть отрегулированы так, что вы обрабатываете только определенные столбцы.
- Назначение:
rollapply
от zoo
. Дополнительными аргументами являются ширина окна 5
и функция sum
, так что это выполняет скользящую сумму. На данный момент out
содержит скользящие суммы (более 5 минут) каждую минуту, но мы хотим, чтобы они каждые 5 минут. Поэтому
- Объединяет
Day_and_time
столбец из исходного df
с out
сохраняя только те столбцы, каждые 5 минут. Обратите внимание, что мы сохраняем последние Day_and_Time
в каждом окне.
- Это просто переименовывает столбцы.
Использование данных MikeyMike, которая является
Day_and_Time rain1 rain2
1 2010-02-12 01:00:00 0.03 0.00
2 2010-02-12 01:01:00 0.03 0.00
3 2010-02-12 01:02:00 0.01 0.00
4 2010-02-12 01:03:00 0.05 0.00
5 2010-02-12 01:04:00 0.03 0.10
6 2010-02-12 01:05:00 0.04 0.00
7 2010-02-12 01:06:00 0.02 0.10
8 2010-02-12 01:07:00 0.10 0.10
9 2010-02-12 01:08:00 0.30 0.00
10 2010-02-12 01:09:00 0.01 0.00
11 2010-02-12 01:10:00 0.00 0.01
это дает:
print(out)
## Day_and_time Rain1_mm/5min Rain2_mm/5min
##1 2010-02-12 01:05:00 0.19 0.10
##2 2010-02-12 01:10:00 0.47 0.21
Обратите внимание на разницу в результате, этот подход предполагает, что вы хотите перекрывающихся окон, так как вы указали, что вы хотите суммируйте шесть чисел между интервалом [i,i+5]
с интервалом 5 минут.
Продлить выше окно в закрытом интервале [i, i+nMin]
в каждой nMin
метки:
library(zoo)
nMin <- 10 ## for example 10 minutes
ind_keep <- seq(1, floor(nrow(df)/nMin)*nMin, by=nMin)
out <- sapply(df[,-1], function(x) rollapply(x, nMin+1, sum))
out <- data.frame(df[ind_keep+nMin, 1],out[ind_keep,])
colnames(out) <- c("Day_and_time",paste0("Rain1_mm/",nMin,"min"),paste0("Rain2_mm/",nMin,"min"))
Для этой работы данные должны иметь по крайней мере 2 * nMin + 1
строки
Надеется, что это помогает.
У вас есть строка за каждую минуту? – aichao
Да, с 01.12.10 18:01 до 02.12.10 18:00. Так что 23 часа, всего 59 минут! – Frosi
Определенно возможно. Было бы неплохо, если бы вы дали некоторые данные для создания решений по использованию dput(). – snoram