Создание цикла for для подмножества данных в R - PullRequest
0 голосов
/ 12 июня 2018

У меня есть огромный набор данных, который в формате .csv имеет 2 столбца (один Date_time, а другой - Q.vanda).Вот как выглядит верх и хвост данных:

    > head(mdf.vanda)
        Date_Time Q.vanda       
    1 1969-12-05 21:00:00       0
    2 1969-12-05 21:01:00       4
    3 1969-12-05 21:05:00      11
    4 1969-12-05 21:20:00      17
    5 1969-12-05 22:45:00      27
    6 1969-12-05 22:55:00      23


    > tail(mdf.vanda)
             Date_Time Q.vanda
    165738 2016-01-19 10:15:00 2995.25
    165739 2016-01-19 10:30:00 2858.04
    165740 2016-01-19 10:45:00 2956.94
    165741 2016-01-19 11:00:00 2972.52
    165742 2016-01-19 11:15:00 2776.99
    165743 2016-01-19 11:30:00 3082.53 

Между ними 48 лет данных, и я хочу создать цикл for для их поднабора по годам (например, с 1969/10 г.)./ 01 - 1970/10/01, 1970/10/01 - 1971/10/01 и т. Д.)

Я написал код, но он выдает ошибку, которую я не могу устранить.Я довольно новичок в R, поэтому не стесняйтесь предложить какой-то другой код, который, по вашему мнению, более эффективен для моей цели.

код:

    cut <- as.POSIXct(strptime(as.character(c('1969/10/01','1970/10/01','1971/10/01','1972/10/01','1973/10/01','1974/10/01','1975/10/01','1976/10/01','1977/10/01','1978/10/01','1979/10/01','1980/10/01','1981/10/01','1982/10/01','1983/10/01','1984/10/01','1985/10/01','1986/10/01','1987/10/01','1988/10/01','1989/10/01','1990/10/01','1991/10/01','1992/10/01','1993/10/01','1994/10/01','1995/10/01','1996/10/01','1997/10/01','1998/10/01',
     '1999/10/01','2000/10/01','2001/10/01','2002/10/01','2003/10/01','2004/10/01',
    '2005/10/01','2006/10/01','2007/10/01','2008/10/01','2009/10/01','2010/10/01',
    '2011/10/01','2012/10/01','2013/10/01','2014/10/01','2015/10/01','2016/10/01')),format = "%Y/%m/%d"))

    df.sub <- as.data.frame(matrix(data=NA,nrow=14496, ncol=96)) #nrow = (31+30+31+31+28)*(4*24)[days * readings/day] , ncol = (48*2)[Seasons*cols]

    i.odd <- seq(1,49, by=2)
    for (i in 1:48) {df.sub[1:length(mdf.vanda$Date_Time[mdf.vanda$Date_Time >= cut[i] & mdf.vanda$Date_Time < cut[i+1]])
    ,i.odd[i]:(i.odd[i]+1)] <- subset(mdf.vanda,mdf.vanda$Date_Time > cut[i] & mdf.vanda$Date_Time < cut[i+1])}

Ошибка:

Ошибка в [<-.data.frame (*tmp*, 1: длина (mdf.vanda $ Date_Time [mdf.vanda $ Date_Time> =: элемент замены 1 имеет 1595 строк, необходимо 1596

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Здесь нет необходимости в петле.Base R имеет функцию cut для выполнения этой самой операции и значительно быстрее, чем цикл.Поскольку у вас есть точки останова, определенные с помощью вашей переменной "cut".

#cut <- as.POSIXct(c('1969/10/01', ... ,'2016/10/01'),format = "%Y/%m/%d")

mytime<-cut(mdf.vanda$Date_Time, breaks = cut, include.lowest = TRUE)

Переменная "mytime" - это вектор длины вашего фрейма данных с меткой для хранения данных.
Вы можетезатем используйте функцию split, чтобы разбить ваш фрейм данных в списке фреймов данных, или используйте функцию group_by из библиотеки dplyr для дополнительной обработки данных.

0 голосов
/ 12 июня 2018

вы можете разделить ваши данные, как показано

split(mdf.vanda,findInterval(as.Date(mdf.vanda$Date_Time),seq(as.Date("1969-10-01"),as.Date("2016-10-01"),"1 year"))
0 голосов
/ 12 июня 2018

Предлагаю вам взглянуть на удобный пакет quantmod.Если у вас есть данные временного ряда, вы можете использовать функцию apply.yearly и применять любую функцию к каждому году данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...