Учитывая список событий с метками времени, как я могу использовать R для расчета средней скорости, с которой происходит такое событие? - PullRequest
1 голос
/ 12 ноября 2010

У меня есть CSV-файл со списком сообщений на форуме. У меня есть метка времени для каждого сообщения в этом формате: ГГГГ-ММ-ДД чч: мм: сс.

Я хочу рассчитать, как часто отправляется новое сообщение, как в «X сообщений в секунду». Я думаю, что мне нужно только среднее значение, медиана и SD для скорости публикации (сообщений в секунду). Я только что загрузил CSV:

d <- read.csv("posts.csv")
colnames(d) <- c("post.id", "timestamp")

Ответы [ 3 ]

3 голосов
/ 12 ноября 2010

Среднее количество сообщений в секунду составляет всего 1 / интервал от последнего сообщения, поэтому создайте вектор разности (раз), а затем возьмите среднее значение (1 / as.numeric (разность (раз))).

> posts <- data.frame(ids = paste(letters[sample(1:26, 100, replace=TRUE)], 
                  sample(1:100) ),  time=Sys.time() +cumsum(abs(rnorm(100))*100) )

    > mean( 1/as.numeric(diff(posts$time)) )
[1] 0.03545346

Редактировать: я думал, что используя cumsum, я получу упорядоченные временные ряды, но это не так, поэтому рекомендуется принять abs (rnorm (100)).

2 голосов
/ 12 ноября 2010

Что-то вроде:

tt <- table(cut(as.POSIXlt(d$timestamp),"1 sec"))
c(mean(tt),median(tt),sd(tt))

Вы не предоставили воспроизводимый пример, поэтому я не уверен на 100%, что это работает, но что-то в этом роде ... также не знаю, насколько хорошо это будетмасштабирование до гигантских наборов данных.

Более подробно (с примером):

set.seed(1001)
n <- 1e5
nt <- 1e5
z <- seq(as.POSIXct("2010-09-01"),length=nt,by="1 sec")
length(z)
z2 <- sample(z,size=n,replace=TRUE)
tt <- table(cut(z2,"1 sec"))
c(mean(tt),median(tt),sd(tt))

Этот небольшой пример показывает, что команда cut () может быть медленной.Поиграйте с параметрами 'nt' (количество секунд в интервале времени от начала до конца) и 'n' (количество сэмплов), чтобы понять, сколько времени займет ваша проблема.

0 голосов
/ 12 ноября 2010

Я не знаю ваш язык программирования, но если вы можете преобразовать временную метку в миллисекунды, просто вычтите самую низкую из самой высокой временной метки, затем разделите на количество записей (строк в posts.csv), а затем разделите на 1000 (миллисекунд).) и ваши левые с сообщениями в секунду.Или, если вы можете получить метку времени в секундах, она будет такой же, за исключением того, что не делите на 1000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...