2009-12-07 68 views
0

我写的函数从XML文档中提取时间戳。时间戳与事件相关联,事件是系列元素的重复元素。使用不同长度的序列

系列元素具有可变数量的事件,所以我的函数返回一个data.frame(如果该系列具有相同的长度)。通常它返回一个更通用的列表,我希望它也可以与矩阵一起使用。我被指出(感谢Eduardo)'list'是泛型类型,但我仍然遇到了泛型列表上的函数,但没有更具体的类型,比如data.frame或matrix。

我现在需要处理的数据是看看时间戳之间最常见的距离是什么(我期望它出现的次数多于50%),我已经写和重写了一个函数这样做:

R> mostCommonStep(list(a=cumsum(c(1,3,3,2,3,3,4,3,2,3,3)), b=cumsum(c(2,3,2,3)))) 
[1] 3 
R> mostCommonStep(data.frame(a=c(2,4,6,8,12,14,18), b=c(12,14,16,18,22,24,28))) 
[1] 2 
R> mostCommonStep(matrix(c(2,4,6,8,12,14,18, 12,14,16,18,22,24,28), 7, 2)) 
[1] 2 

,但我希望看到更多的“R”符合的版本

回答

0

我想我会用这一个(如最常见的一步真的发生往往比在50%的案件作品)定居。

mostCommonStep <- function(L) { 
    ## returns the value of the most common difference between 
    ## subsequent elements. 

    ## takes into account only forward steps, all negative steps are 
    ## discarded. works with list, data.frame, matrix. 
    L <- diff(unlist(sapply(as.list(L), as.numeric))) 
    as.numeric(quantile(L[L>0], 0.5)) 
} 
2

数据帧列表。假设时间戳之间的距离在list/data.frame y中的向量“x”中。你可以做sort(-table(y[["x"]]))[1]来获得模式。

+0

我的数据只包含时间戳。即:所有列都包含时间戳,我想检查所有列。 – mariotomo 2009-12-08 08:15:31

2

解决此问题的最佳方法是使用不规则的时间序列对象(请参阅the time series view on CRAN)。你有几个很好的选择(例如timeSeries,its,fts,xts),但其中最受欢迎的是the zoo package。您可以创建一个时间序列,像这样:

library(zoo) 
x.Date <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1 
x <- zoo(rnorm(5), x.Date) 

然后,看到每个事件之间的时间差,你可以使用比较函数来创建一个difftime对象:

> diff(index(x)) 
Time differences in days 
[1] 2 4 2 5 

你可以分析这些时间差就如您在任何其他变量,例如:

> summary(diff(index(x))) 
    Min. 1st Qu. Median Mean 3rd Qu. Max. 
    2.00 2.00 3.00 3.25 4.25 5.00 

同样,要找到最常见的时间差,你可以使用任何其他STA如table() ndard方法:

> table(diff(index(x))) 
2 4 5 
2 1 1 
+0

恐怕我的问题是,我对“其他任何情况”以及“其他标准方法[西]”没有(还)有信心。 – mariotomo 2009-12-08 08:13:11