使用带有strptime()格式化日期的tapply()

时间:2014-06-23 13:53:01

标签: r strptime tapply

我只想从一整天定期拍摄的一组值中计算每日均值,但是在数据集中的多个不同日期。当我的日期是一个因素

时,tapply()很棒
    > Data$Data <- as.factor(Data$Date)
    > str(Data$Date)
    Factor w/ 55 levels "01/05/2014","02/05/2014",..: 3 3 3 3 3 3 3 3 3 3 ...
    > tapply(Data$Humidity,Data$Date, FUN = mean)
    01/05/2014 02/05/2014 03/04/2014 03/05/2014 04/04/2014 04/05/2014 05/04/2014 05/05/2014 06/04/2014 
    99.96875   100.00000  96.65833   99.80625   84.14375   89.56042   93.75833   39.58750   87.55000 

这给了我我想要的东西,但这些日期不再按照时间顺序排列,因为我已经把它作为一个因素。

相反,我尝试使用strptime()作为R的公认日期格式。从头开始....

    > Data$Date<-strptime(Data$Date, format="%d/%m/%Y")
    > str(Data$Date)
    POSIXlt[1:2586], format: "2014-04-03" "2014-04-03" "2014-04-03" "2014-04-03" "2014-04-03" "2014-04-03" ...
    > tapply(Data$Humidity,Data$Date, FUN = mean)
    Error in INDEX[[i]] : subscript out of bounds

但是我收到以下错误消息?有谁知道为什么这不起作用?

3 个答案:

答案 0 :(得分:1)

您可能希望查看像dplyr这样不需要像tapply函数这样的因素的包。 =&GT; http://cran.r-project.org/web/packages/dplyr/dplyr.pdf

语法就像,

DF <- your data frame
gb <- group_by(DF, Date)
DF <- mutate(gb, Mean_Humidity = mean(Humidity)
DF <- arrange(DF, date)

答案 1 :(得分:0)

您可以在执行tapply

时将日期转换为系数
tapply(Data$Humidity,factor(Data$Date), FUN = mean)

tapply功能需要一个因素。

答案 2 :(得分:0)

我还发现我可以简单地将tapply()输出改为strptime(),之后通过dataframe()而不是之前尝试执行,然后按日期命令()

    Data$Date <- as.factor(Data$Date)
    DAVEH <- tapply(Data$Humidity,Data$Date, FUN = mean)

    site.daily<-data.frame(c(names(DAVEH)),c(DAVEH))
    rownames(site.daily)<-seq_len(nrow(site.daily))
    colnames(site.daily)<-c("Date","DAVEH")

    site.daily$Date<-strptime(site.daily$Date, format="%d/%m/%Y")

    site.daily<-site.daily[order(site.daily$Date),]
    rownames(site.daily)<-seq_len(nrow(site.daily)) # again as they have been re-ordered

  > site.daily
     Date     DAVEH
 1  2014-04-03  96.65833
 2  2014-04-04  84.14375
 3  2014-04-05  93.75833
 4  2014-04-06  87.55000
 5  2014-04-07  58.87708
 6  2014-04-08  99.83542
 7  2014-04-09  87.68125.....

等等。