我有一个数据框,即“数据”,其中包含大约每半小时收集的整整一年的数据,但是在几天中,仅收集了几个小时的数据。
日期的格式为:31.01.2010 00:30
(全部集中在一个单元格中)变量为:Temperature
,humidity
,PM10
,windspeed
等
第一个问题:如何计算这些变量的每日平均值,中位数,最大值,最小值,值,这样我就可以在进一步的分析(例如,使用GAM进行生存分析)中测试每个变量,而不是每小时/半小时数据?
显然,应该将计算出的每日平均/中位数分配给其相应的日期。
第二个问题:DATES
列同时包含日期和时间,在同一单元格中用一个空格分隔。在R中,其类型为'Factor'
,由于出现错误"dates" is missing
,我无法进行任何计算。
我的猜测是,我需要先将其从Factor
转换为date/time
,以便可以识别它,然后计算均值/中位数。但是我该怎么做?
您能指出要使用的参数/函数吗?
[我认为我已经解决了日期从'Factor'到POSIXlt的转换:我使用了strptime函数(Data $ DATES,format =“%d。%m。%Y%H:%M”),现在使用了$日期被识别为POSIXlt,格式为“ 2010-01-01 00:00:00” ....
但是我仍然需要找到计算日均值或平均值或中位数或其他任何值的函数。
问题有几个部分。在计算中位数统计数据之前,需要对数据框进行按摩,以使其具有适当的类型。
对于这些解释,我假设您有一个名为dt
的数据框。
第1部分:转换数据框的数据类型
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
,不包括时间,因此我们需要提取该信息。您需要将其放在新列中以保存时间。
dt$date_alt <- strptime(x = as.character(dt$Date),
format = "%d.%m.%Y")
第2部分:计算按特定字段分组的摘要统计信息
[现在,我们使数据框看起来像我们想要的样子,您可以计算按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
)
中断ddply
呼叫:
ddply
本质上是作用于数据帧的函数。这是函数调用的参数细分:
dt
-您要迭代的数据框的名称.(date_alt)
-您要分组依据的列的名称。从概念上讲,这会将数据帧拆分为一堆子数据帧,其子行由原始数据帧的行组成,这些行在括号中列出的列中具有相同的值。 summarize
-告诉ddply
调用您要计算子数据帧上的汇总统计信息med_temp = median(Temperature)
和所有类似的行-定义结果数据帧中的一列。这表示您希望新数据框具有一个名为med_temp
的列,其中包含每个子数据框的median(Tempurature)
结果。请记住,您可以使用想要的任何函数代替median
来聚合值。首先,将时间序列转换为xts
对象。然后使用xts
等函数计算所需的数据参见apply.daily()
小插图xts
。
我认为以下代码段应该有效:
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)
)