Рассчитать сумму отсчетов в минуту из фрейма данных в R

Я пытался выяснить это некоторое время, но не смог этого сделать. Я нашел много похожих вопросов, которые совсем не помогли.

У меня около 43000 записей во фрейме данных в R. Столбец даты имеет формат "2011-11-15 02:00:01", а другой столбец - количество. Структура фрейма данных:

str(results)
'data.frame':   43070 obs. of  2 variables:
 $ dates: Factor w/ 43070 levels "2011-11-15 02:00:01",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ count: num  1 2 1 1 1 1 2 3 1 2 ...

Как я могу получить общее количество в минуту?

И я также хочу преобразовать results кадр данных в JSON. я использовал rjson пакет, который преобразовал весь фрейм данных как один элемент json. Когда я вставил в mongodb, был только на _id для всех 43000 записей. Что я сделал не так?

2 ответа

Решение

Вы можете использовать xts Пакет, чтобы получить количество / минуту довольно легко.

install.packages("xts")
require("xts")
results_xts <- xts(results$count, order.by = as.POSIXlt(results$dates))

Это преобразует ваш фрейм данных в объект xts. Есть куча функций (apply.daily, apply.yearlyи т. д.) в xts которые применяют функции к разным временным рамкам, но их нет за минуту. К счастью, код для этих функций очень прост, поэтому просто запустите

ep <- endpoints(results_xts, "minutes")
period.apply(results_xts, ep, FUN = sum)

Извините, я не знаю ответа на ваш другой вопрос.

Звездочка здесь, непроверенная, но вот мое решение для получения количества отсчетов в минуту, может быть, кто-то будет вмешиваться в части JSON, я не знаком с этим

вот мой пример временного ряда и подсчета

tseq<-seq(now,length.out=130, by="sec")
count<-rep(1, 130)

мы находим индекс того, где наши минуты переключаются через следующее

mins<-c(0,diff(floor(cumsum(c(0,diff(tseq)))/60)))
indxs<-which(mins%in%1)

Позвольте мне разбить это (так как там много вложенных вещей).

  1. Сначала мы дифференцируем по временной последовательности, затем добавляем 0 на фронте, потому что мы теряем наблюдение с diff
  2. Во-вторых, суммируйте вектор разности, давая нам значение секунд в каждой точке (это, вероятно, также можно сделать простым вызовом формата по вектору времен)
  3. В-третьих, разделите этот вектор, теперь секунды в каждой точке, на 60, чтобы мы получили значение в каждой точке, соответствующее минутам.
  4. В-четвертых, слово это так, чтобы мы получили целые числа
  5. разность этого вектора, поэтому мы получаем 0, за исключением 1, где минутные переключатели
  6. добавить 0 к этому вектору, так как мы теряем наблюдение с разницей
  7. затем получить значение 1 с помощью которого вызов

тогда мы найдем начало и конец наших минут

startpoints<-indxs
endpoints<-c(indxs[2:length(indxs)], length(mins))

тогда мы просто суммируем по соответствующему подмножеству

mapply(function(start, end) sum(count[start:end]), start=startpoints, end=endpoints)
#[1] 61 10

Мы получаем 61 для первой точки, потому что мы включаем 0-ю и 60-ю секунды для первого подмножества

Другие вопросы по тегам