在R上创建for循环到子集数据

时间:2018-06-12 15:55:53

标签: r dplyr grouping

我有一大堆数据,.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&gt; =:   替换元件1有1595行,需要1596

3 个答案:

答案 0 :(得分:1)

您可以如图所示拆分数据

split(mdf.vanda,findInterval(as.Date(mdf.vanda$Date_Time),seq(as.Date("1969-10-01"),as.Date("2016-10-01"),"1 year"))

答案 1 :(得分:0)

我建议您查看方便的quantmod包。获得时间序列数据后,您可以使用apply.yearly函数并将任何函数应用于每年的数据。

答案 2 :(得分:0)

这里不需要循环。 Base R具有cut函数来执行此操作,并且比循环快得多。由于你的&#34; cut&#34;定义了断点。变量

#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)

变量&#34; mytime&#34;是一个向量,数据框的长度,带有用于存储数据的标签 然后,您可以使用split函数在数据帧列表中中断数据帧,或使用dplyr库中的group_by函数进行其他数据处理。