Рассчитать сумму отсчетов в минуту из фрейма данных в 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)
Позвольте мне разбить это (так как там много вложенных вещей).
- Сначала мы дифференцируем по временной последовательности, затем добавляем 0 на фронте, потому что мы теряем наблюдение с diff
- Во-вторых, суммируйте вектор разности, давая нам значение секунд в каждой точке (это, вероятно, также можно сделать простым вызовом формата по вектору времен)
- В-третьих, разделите этот вектор, теперь секунды в каждой точке, на 60, чтобы мы получили значение в каждой точке, соответствующее минутам.
- В-четвертых, слово это так, чтобы мы получили целые числа
- разность этого вектора, поэтому мы получаем 0, за исключением 1, где минутные переключатели
- добавить 0 к этому вектору, так как мы теряем наблюдение с разницей
- затем получить значение 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-ю секунды для первого подмножества