首页 文章

如何根据R中每小时收集的天气变量数据计算每日平均值,中位数?

提问于
浏览
0

我有这个数据框,“数据”,包含每半小时收集的一整年的数据,但有些日子只收集了几个小时的数据 .

日期格式为: 31.01.2010 00:30 (所有在一个单元格中)变量为: TemperaturehumidityPM10windspeed 等 .

First question :我如何计算这些变量的每日平均值,中位数,最大值,最小值,值,以便我可以在进一步分析中测试每一个,例如使用GAM进行生存分析),而不是每小时/半小时数据?

显然,计算的每日平均值/中位数应分配到相应的日期 .

Second questionDATES 列同时包含日期和时间,在同一单元格中以一个空格分隔 . 在R中,它的类型是 'Factor' ,我无法进行任何计算,因为出现错误 "dates" is missing .

我的猜测是我需要先将它从 Factor 转换为 date/time 所以它可以被识别然后计算均值/中位数 . 但是我该怎么做?

你能说明一下要使用的参数/功能吗?

我认为我已经解决了从'Factor'到POSIXlt的日期转换:我使用函数strptime(Data $ DATES,format =“%d . %m . %Y%H:%M”)现在$ DATES是被识别为POSIXlt,格式为“2010-01-01 00:00:00”....

但我仍然需要找到计算每日平均值或平均值或中位数或其他值的函数 .

2 回答

  • -1

    这个问题有几个部分 . 在计算中值统计量之前,您需要按摩数据帧以使其具有适当的类型 .

    对于这些解释,我将假设您有一个名为 dt 的数据帧 .

    Part 1: Converting the datatypes of the dataframe

    date factor to datetime StackOverflow

    datetime POSIXct conversion StackOverflow

    首先,您需要将 Date 列从 factor 类型转换为 datetime 类型 .

    dt$Date <- strptime(x = as.character(dt$Date),
                        format = "%d.%m.%Y %H:%M")
    
    dt$date_alt <- as.POSIXct(dt$date_alt) # convert the format of datetime to allow use with ddply
    

    然后,因为我假设你想要 day-month-year 的中位数统计,不包括时间,我们'll need to extract that info. You' ll想把它放在一个新列中以保留时间 .

    dt$date_alt <- strptime(x = as.character(dt$Date),
           format = "%d.%m.%Y")
    

    Part 2: Calculating summary statistics grouped by a particular field

    现在我们已经让数据框看起来像我们想要的那样,您可以计算按 day-month-year 分组的平均统计数据,在我们的例子中是 date_alt 列 .

    plyr 包提供了一个非常好的功能: ddply

    library(plyr) # need this library for the plyr call
    
    summ <- ddply(dt, .(date_alt), summarize, 
                  med_temp = median(!is.na(Temperature)),
                  mean_temp = mean(!is.na(Temperature)), # you can also calc mean if you want
                  med_humidity = median(!is.na(humidity)),
                  med_windspeed = median(!is.na(windspeed))
                  # etc for the rest of your vars
              )
    

    Breaking down the ddply call:

    ddply cookbook explanation

    ddply 本质上是一个作用于数据帧的函数 . 这是函数调用的参数细分:

    • dt - 要迭代的数据帧的名称

    • .(date_alt) - 要分组的列的名称 . 从概念上讲,这会将数据帧拆分为一堆子数据帧,这些子数据行的行由原始数据帧中的行组成,这些行在括号中列出的列中共享相同的值 .

    • summarize - 这告诉 ddply 调用您要计算子数据帧的聚合统计信息

    • med_temp = median(Temperature) 和所有类似的行 - 在结果数据框中定义一列 . 这表示您希望新数据框有一个名为 med_temp 的列,其中包含每个子数据帧的 median(Tempurature) 结果 . 请记住,您可以使用您想要的任何功能来代替 median 而不是 median .

  • 0

    首先,将您的时间序列转换为 xts 对象 . 然后使用 xts 函数计算所需的数据,例如 apply.daily() 参见 xts vignette here .

    我认为以下代码段应该有效:

    # Load library xts
    require(xts)
    
    # Create example dataframe 
    datetime <- c('31.01.2010 00:30', '31.01.2010 00:31', '31.01.2010 10:32', '01.02.2010 10:00', '01.02.2010 11:03', '01.03.2011 08:09', '01.03.2011 21:00', '01.03.2011 22:00')
    value <- c(1.5, 2, 2.5, 7, 3.5, 9, 4.5, 7.5)
    df <- data.frame(datetime, value)
    
    # Create xts object
    df.xts <- as.xts(df[,2], order.by=as.Date(df[,1], format='%d.%m.%Y %H:%M'))
    
    # Daily mean
    d.mean <- apply.daily(df.xts, mean)
    
    # Daily median
    d.median <- apply.daily(df.xts, median)
    
    # Daily min
    d.min <- apply.daily(df.xts, min)
    
    # Daily max
    d.max <- apply.daily(df.xts, max)
    

    (或者,见RFiddle

相关问题