1

我只想从一天中定期获取的一组值中计算出每日平均值,但是对于数据集中的多个不同日期。当我的日期是一个因素时,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

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

4

3 回答 3

1

您可能想查看像 dplyr 这样不需要像 tapply 函数这样的因素的包。=> 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)
于 2014-06-23T14:06:22.903 回答
0

我还发现我可以简单地将 tapply() 输出更改为 strptime() 之后,通过 dataframe() 而不是之前尝试这样做,然后按日期 order()

    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.....

等等。

于 2014-07-01T09:28:34.197 回答
0

您可以在执行时将日期转换为因子tapply

tapply(Data$Humidity,factor(Data$Date), FUN = mean)

tapply函数需要一个因子。

于 2014-06-23T13:57:28.387 回答