【问题标题】:time binning and calculating weighted means时间分箱和计算加权均值
【发布时间】:2012-02-19 19:30:08
【问题描述】:

我有一个如下所示的数据框(8 列 - myPOSIX 列采用 'y-m-d h:s' 格式)

head(new)
Date.and.Time..UTC.    Receiver    Transmitter Latitude Longitude ndiffs29912  flag             
1    07/10/2010 15:53 VR2W-107619 A69-1303-29912 48.56225 -53.89144          NA FALSE 2010-10-07 
2    07/10/2010 15:56 VR2W-107619 A69-1303-29912 48.56225 -53.89144         180 FALSE 2010-10-07 
3    07/10/2010 16:00 VR2W-107619 A69-1303-29912 48.56225 -53.89144         240 FALSE 2010-10-07 
4    07/10/2010 16:24 VR2W-107619 A69-1303-29912 48.56225 -53.89144        1440 FALSE 2010-10-07 
5    07/10/2010 16:45 VR2W-104556 A69-1303-29912 48.56460 -53.88956        1260 FALSE 2010-10-07 
6    07/10/2010 16:47 VR2W-107619 A69-1303-29912 48.56225 -53.89144         120 FALSE 2010-10-07  
myPOSIX
15:53:00
15:56:00
16:00:00
16:24:00
16:45:00
16:47:00

我的目标是将检测分类到小时时间箱中。然后,对于每个时间箱,我想计算纬度和经度的加权平均值,使用每个接收器的检测次数作为加权度量(即每个箱中不同接收器名称的频率)。 任何见解都将不胜感激 - 我一直在尝试使用 zoo 和 xts 包编写代码来聚合每小时检测,但没有成功。

【问题讨论】:

  • 这部分不清楚:“使用每个接收器的检测次数作为加权度量(即每个bin中不同接收器名称的频率)”。加权时,您为每个观察提供一个权重。现在听起来的方式是,您真的只想要按小时、接收器、纬度(或经度)计算的均值(未加权)。

标签: r xts zoo


【解决方案1】:
# Dummy data
x <- data.frame(
  date=as.POSIXct(1:10000,origin="2005-01-01 12:00:00"),
receiver=rep(letters[1:10],1000),
  Latitude=rep(letters[1:10],1000),
  Longitude=rep(letters[1:10],1000),
  ndiffs29912=rnorm(10000)+10)

# Break dates into hours using cut append to data frame
x$hour <- cut(x$date, breaks="hour")

library(plyr) 
# By hour and latitude, get weighted
# mean of ndiffs based on number of receivers
ddply(x, .(hour, latitude), function(x) data.frame(
weighted.mean(x$ndiffs29912, length(x$receiver), na.rm=T))

# By hour and longitude, get weighted
# mean of ndiffs based on number of receivers
ddply(x, .(hour, longitude), function(x) data.frame(
weighted.mean(x$ndiffs29912, length(x$receiver), na.rm=T))

【讨论】:

  • 感谢您的快速回复。我想了解您的方法,但我有一个问题。对于 Ri 接收器,length(x$receiver) 参数是否使用第 i 个接收器的检测次数之和来加权平均值?
  • ddply 将您的数据按小时和经度(或纬度)分成几组。它本质上是子集(x,小时 == A & 经度 == B)的程序化简写,其中 A 和 B 都是小时和经度/纬度的可能组合。如果您还需要接收者的加权平均值,则代码将更改为ddply(x, .(hour, receiver, longitude) ...)
  • 感谢您抽出宝贵时间帮助我,布兰登,我真的很感激。好的,这是有道理的。但我真正想做的是计算每个小时子集的纬度位置的加权平均值,使用每个接收器的检测次数作为权重。如果我如下所示修改您的代码,我会收到一条错误消息,显示 x 和 w 的长度不同。我的接收器列和纬度列的长度相同,所以我不明白。我是否必须添加一个函数来计算权重每小时时间段中不同接收器类型的频率?
  • ddply(t.29912, .(hourbins,Receiver), function(t.29912) data.frame( weighted.mean(t.29912$Latitude, length(t.29912$Receiver)) ))
  • 我正在尝试按照这个公式来计算加权平均值:对于超过一小时的 delta-t 的 i 接收器,总和((第 i 个接收器的检测数)* i 的纬度-th 接收器)/sum(#of 检测器在第 i 个接收器)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2012-04-26
  • 2021-11-24
  • 2012-04-20
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多