我有这个数据框,“数据”,包含每半小时收集的一整年的数据,但有些日子只收集了几个小时的数据。
日期格式为: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,格式为“2010-01-01 00:00:00”....
但是我仍然需要找到计算每日平均值或平均值或中位数或其他任何值的函数。
答案 0 :(得分:0)
首先,将时间序列转换为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)
(或者,见RFiddle)
答案 1 :(得分:-1)
问题有几个部分。在计算中位数统计数据之前,您需要按下数据框以使其具有适当的类型。
对于这些解释,我假设您有一个名为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
。