【问题标题】:working with sequences of different length处理不同长度的序列
【发布时间】:2010-12-24 02:05:24
【问题描述】:

我编写的一个函数从 XML 文档中提取时间戳。时间戳与事件耦合,事件是系列元素的重复元素。

系列元素具有可变数量的事件,因此我的函数返回一个 data.frame(如果系列具有相同的长度)。一般来说,它会返回一个更通用的列表,我希望它也可以与矩阵一起使用。有人指出(感谢 Eduardo)'list' 是泛型类型,但我仍然无法使用适用于泛型列表但不适用于更具体类型(如 data.frame 或矩阵)的函数。

我现在需要对数据做的是查看时间戳之间最常见的距离是多少(我希望它出现的频率(多于)超过 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”的版本

【问题讨论】:

    标签: r


    【解决方案1】:

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

    【讨论】:

    • 我的数据只包含时间戳。也就是说:所有列都包含时间戳,我想检查所有列。
    【解决方案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)
    

    然后,要查看每个事件之间的时间差异,您可以使用 diff 函数创建一个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 
    

    同样,要找到最常见的时差,您可以使用任何其他标准方法,例如table()

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

    【讨论】:

    • 恐怕我的问题是我(还)对“任何其他情况”和“其他标准方法[es]”没有信心。
    【解决方案3】:

    我想我会解决这个问题(如果最常见的步骤确实比 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))
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2019-10-17
      • 2017-11-12
      • 1970-01-01
      • 2018-12-01
      • 2016-04-22
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      相关资源
      最近更新 更多