我有一个数据框架"Data",包含大约每半小时收集一整年的数据,但有些日子只收集了几个小时的数据。
日期的格式为: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"),现在$DATES被识别为POSIXlt,format"2010-01-01 00:00:00"。。。。
但我仍然需要找到计算日均值或平均值或中位数或其他什么的函数。
首先,将时间序列转换为xts
对象。然后使用xts
函数(如apply.daily()
)计算所需的数据请参阅此处的xts
小插曲。
我觉得以下片段应该有效:
# 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)
(或者,请参阅投标书)
这个问题有几个部分。在计算中值统计信息之前,需要对数据帧进行处理,使其具有适当的类型。
对于这些解释,我假设您有一个名为dt
的数据帧。
第1部分:转换数据帧的数据类型
日期因子到日期时间StackOverflow
datetime POSIXct转换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食谱解释
CCD_ 25本质上是一个作用于数据帧的函数。以下是函数调用的参数分解:
dt
——要迭代的数据帧的名称.(date_alt)
——要分组的列的名称。从概念上讲,这将数据帧拆分为一堆子数据帧,这些子数据帧的行由原始数据帧中的行组成,这些行在括号中列出的列中共享相同的值summarize
——这告诉ddply
调用您想要计算子数据帧的聚合统计信息- CCD_ 30和所有类似的行——在结果数据帧中定义一列。这表示您希望新数据帧具有一个名为
med_temp
的列,该列包含每个子数据帧的median(Tempurature)
结果。请记住,您可以使用聚合值所需的任何函数,而不是median