2015-12-17 168 views
0

我有这个数据框,“数据”,包含大约每半小时收集一整年的数据,但有些日子只收集了几小时的数据。如何计算每小时在R中收集的天气变量数据的日平均值,中位数?

日期的格式为:31.01.2010 00:30(都在同一个小区) 变量是:TemperaturehumidityPM10windspeed

第一个问题:我如何计算每天的手段,中位数,最大值,最小值,这些变量的值,因此我可以在进一步的分析中进行测试,例如使用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” ......

但我仍然需要找到一个计算日平均或平均数或中位数或任何功能。

+0

我认为我已经解决了日期从“要素”来POSIXlt转换:我使用的功能strptime(Data $ DATES,format =“%d。%m。%Y%H:%M”),现在$ DATES被识别为POSIXlt格式“2010-01-01 00:00:00”.... –

+0

删除了'生存分析'和'gam'标记,因为它们都不适用于这个问题。 –

回答

-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 cookbook explanation

ddply本质上是一个功能它对数据帧起作用。下面是参数的函数调用的细目:

  1. dt - 您想组列的名称 - 要遍历
  2. .(date_alt)数据框的名称。 从概念上讲,这会将数据框分割成一堆子数据框,其行由原始数据框中的行组成,这些行在圆括号中列出的列中共享相同的值。
  3. summarize - 这告诉你想在subdataframes
  4. med_temp = median(Temperature)以及所有类似的路线计算汇总统计的ddply通话 - 在结果数据帧中的列。这表示您希望新数据框有一个名为med_temp的列,其中包含每个子数据框的median(Tempurature)结果。 请记住,而不是median你可以使用任何你想要的功能的聚合值。
+0

感谢xgord获取有价值的信息。我已根据您的工具创建了日期替代列ction。我现在要研究ddply函数,并且会发布后者,因为我需要一些时间来弄清楚正确的语法。 –

+0

xgord,我试过你的代码;似乎有一个问题。在summ后得到输出DATE_ALT med_pm10 mean_pm10 med_temp mean_temp 1 1 1 1 1有什么想法可能会出错?谢谢。 –

+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

+0

edouard,我检查了xts vignette,并没有发现任何关于中位数,手段或其他常见的统计数据;你确定这个软件包可以做到吗?无论如何,下面的选项,由xgord提出的作品,虽然。 –

+0

你好,我刚才编辑了我的答案。请参阅上文。 (希望我得到了你以后的) – tagoma

相关问题