работа с последовательностями разной длины - PullRequest
0 голосов
/ 07 декабря 2009

функция, которую я написал, извлекает временные метки из документа XML. Метки времени связаны с событиями, которые являются повторяющимися элементами элемента серии.

Элементы серии

имеют переменное количество событий, поэтому моя функция возвращает data.frame (если серии имеют одинаковую длину). в общем случае он возвращает более общий список, и я хочу, чтобы он работал и с матрицами. Мне было сказано (спасибо Эдуардо), что «список» является универсальным типом, но у меня все еще есть проблемы с функциями, которые работают с универсальными списками, но не с более конкретными типами, такими как 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"

Ответы [ 3 ]

2 голосов
/ 08 декабря 2009

Лучший способ приблизиться к этому, вероятно, состоит в использовании объекта нерегулярного временного ряда (см. представление временного ряда в CRAN ). У вас есть несколько хороших вариантов (например, timeSeries, its, fts, xts), но наиболее популярными из них являются 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 
2 голосов
/ 07 декабря 2009

фреймы данных являются списками. Предположим, что расстояние между метками времени находится в векторе «x» в list / data.frame y. Вы можете сделать sort(-table(y[["x"]]))[1], чтобы получить режим.

0 голосов
/ 09 декабря 2009

Думаю, я бы с этим согласился (работает, если самый распространенный шаг действительно происходит чаще, чем в 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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...