使用zoo读取并在列上拆分数据框

时间:2013-02-23 01:55:16

标签: r time-series zoo

我有一个表格,其中包含restaurants分数的观察结果(由ID标识)。变量mean是以每天为中心(即从3天到3天之后)的为期一周的窗口中收到的评论的平均评分,变量count是收到的评论数在同一窗口中(请参阅下面的代码,了解随机生成的数据框样本的dput)。

我有兴趣看看那些在任何一个变量中都含有大量峰值的餐馆(就像突然他们的平均评分上升很多,或突然下降)。对于那些餐馆,我想通过绘制分布来调查正在发生的事情(我有很多餐馆所以我不能手动完成,我必须限制我的域名进行半人工检查)。

另外,由于我的数据是日复一日的,我希望它不那么精细。特别是,我希望将单个值中给定月份的所有评级或计数平均。

我认为动物园应该帮助我做得很好:给定示例中的数据框,我想我可以将它转换为动物园时间序列,这是我想要的方式聚合并通过使用分割我想要的方式:

z <- read.zoo(df, split = "restaurantID", 
       format = "%m/%d/%Y", index.column = 2, FUN = as.yearmon, aggregate = mean)

但是,在restaurantID上拆分不会产生预期的结果。我得到的是很多NAs:

     mean.1006054 count.1006054 mean.1006639 count.1006639 mean.1006704 count.1006704 mean.1007177 count.1007177
Lug 2004           NA            NA           NA            NA           NA            NA           NA            NA
Ago 2004           NA            NA           NA            NA           NA            NA           NA            NA
Nov 2004           NA            NA           NA            NA           NA            NA           NA            NA
Gen 2005           NA            NA           NA            NA           NA            NA           NA            NA
Feb 2005           NA            NA           NA            NA           NA            NA           NA            NA
Mar 2005           NA            NA           NA            NA           NA            NA           NA            NA
         mean.1007296 count.1007296 mean.1007606 count.1007606 mean.1007850 count.1007850 mean.1008272 count.1008272
Lug 2004           NA            NA           NA            NA           NA            NA           NA            NA
Ago 2004           NA            NA           NA            NA           NA            NA           NA            NA
Nov 2004           NA            NA           NA            NA           NA            NA           NA            NA
Gen 2005           NA            NA           NA            NA           NA            NA           NA            NA
Feb 2005           NA            NA           NA            NA           NA            NA           NA            NA
Mar 2005           NA            NA           NA            NA           NA            NA           NA            NA

请注意,如果我没有将它拆分到restaurantID列上,它就会起作用。

df$website <- NULL
> z <- read.zoo(df, format = "%m/%d/%Y", index.column = 2, FUN = as.yearmon, aggregate = mean)
> head(z)
         restaurantID     mean count
Lug 2004      1418680 3.500000     1
Ago 2004      1370457 5.000000     1
Nov 2004      1324645 4.333333     1
Gen 2005      1425933 1.920000     1
Feb 2005      1315289 3.000000     1
Mar 2005      1400577 2.687500     1

此外,plot.zoo(z)有效但当然生成的图对我没有意义。

我的问题是:

1)如何过滤任一列中“月月”峰值较高的餐馆?

2)我如何拆分restaurantID并绘制只有这些餐厅的时间​​序列?

DATA HERE (wouldn't fit SO's word limit)

2 个答案:

答案 0 :(得分:0)

尝试:

# helper function to calculate change per time interval in a sequence
difflist <- function(v) {rr <- 0; for (i in 2:length(v)) {rr <- c(rr, v[i] - v[i-1])}; return(rr) }

# make center as dates
df$center <- as.Date(df$center,format='%m/%d/%Y')

# sort data frame in time order
df <- df[order(df$restaurantID, df$center),]

# now calculate the change in each column
deltas <- ddply(df, .(restaurantID), function(x) {cbind(center = x$center, delta_mean = difflist(x$mean), delta_count = difflist(x$count)) } )

# filter out only the big spikes
deltas_big <- subset(deltas, delta_mean > 2 | delta_count > 3)

# arrange the data
delta_melt <- melt(deltas_big,id.vars=c('restaurantID','center'))

# now plot by time
ggplot(delta_melt, aes(x=center,y=value,color=variable)) + geom_point()

答案 1 :(得分:0)

开发了robfilter r软件包,用于根据时间序列分析的稳健统计方法过滤时间序列数据,以选出异常值。您可以使用adore.filter函数使模式适合数据,然后选择偏离信号的异常值。