Агрегирование ежедневного контента - PullRequest
3 голосов
/ 01 сентября 2010

Я пытался агрегировать (некоторые беспорядочные) ежедневные данные. Я на самом деле работаю с данными CSV, но если я воссоздаю их - это будет выглядеть примерно так:

library(zoo)

dates <- c("20100505", "20100505", "20100506", "20100507")
val1 <- c("10", "11", "1", "6")
val2 <- c("5", "31", "2", "7")

x <- data.frame(dates = dates, val1=val1, val2=val2)
z <- read.zoo(x, format = "%Y%m%d")

Теперь я хотел бы агрегировать это ежедневно (обратите внимание, что иногда в течение дня> 1 назначается дата, а иногда нет.

Я перепробовал множество вариантов, но я не могу объединиться, так что, например, это не получается:

aggregate(z, as.Date(time(z)), sum)
# Error in Summary.factor(2:3, na.rm = FALSE) : sum not meaningful for factors

Кажется, что есть много контента, касающегося совокупности, и я пробовал несколько версий, но не могу суммировать это на ежедневном уровне. Я также хотел бы запустить cummax и кумулятивные средние в дополнение к ежедневному суммированию.

Любая помощь будет принята с благодарностью.

Обновление

Код, который я на самом деле использую, выглядит следующим образом:

z <- read.zoo(file = "data.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE, blank.lines.skip = T, na.strings="NA", format = "%Y%m%d");

Кажется, моя (непреднамеренная) цитата из приведенных выше чисел похожа на то, что происходит на практике, потому что, когда я делаю:

aggregate(z, index(z), sum)
#Error in Summary.factor(25L, na.rm = FALSE) : sum not meaningful for factors

Есть несколько столбцов (около 100), как я могу автоматически указать их как числовые? (stringAsFactors = False не работает?)

Ответы [ 4 ]

5 голосов
/ 01 сентября 2010

Или вы агрегируете перед использованием zoo (хотя val1 и val2 должны быть числовыми).

x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2))
y <- aggregate(x[,2:3],by=list(x[,1]),FUN=sum)

, а затем вводите y в зоопарк.

Вы избегаете предупреждения :)

4 голосов
/ 01 сентября 2010

Вы пошли по правильному пути, но допустили пару ошибок.

Во-первых, в зоопарке используются только матрицы, а не data.frames. Во-вторых, те, кто нуждается в числовых входах:

> z <- zoo(as.matrix(data.frame(val1=c(10,11,1,6), val2=c(5,31,2,7))), 
+          order.by=as.Date(c("20100505","20100505","20100506","20100507"),
+                           "%Y%m%d"))
Warning message:
In zoo(as.matrix(data.frame(val1 = c(10, 11, 1, 6), val2 = c(5,  :
  some methods for "zoo" objects do not work if the index entries in 
  'order.by' are not unique

Это дает нам предупреждение, стандартное для зоопарка: оно не любит идентичные временные индексы.

Всегда хорошая идея показать структуру данных, возможно, через str(), возможно, запустите на ней summary():

> z
           val1 val2
2010-05-05   10    5
2010-05-05   11   31
2010-05-06    1    2
2010-05-07    6    7

И затем, как только мы это получим, агрегация будет простой:

> aggregate(z, index(z), sum)
           val1 val2
2010-05-05   21   36
2010-05-06    1    2
2010-05-07    6    7
> 
1 голос
/ 14 января 2011

Преобразовать символьные столбцы в числовые, а затем использовать read.zoo, используя аргумент aggregate:

> x[-1] <- lapply(x[-1], function(x) as.numeric(as.character(x)))
> read.zoo(x, format = "%Y%m%d", aggregate = sum)
             val1 val2
2010-05-05   21   36
2010-05-06    1    2
2010-05-07    6    7
1 голос
/ 01 сентября 2010

val1 и val2 являются символьными строками.data.frame() преобразует их в факторы.Суммирующие факторы не имеют смысла.Вы, вероятно, намеревались:

x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2))
z <- read.zoo(x, format = "%Y%m%d")
aggregate(z, as.Date(time(z)), sum)

, что дает:

           val1 val2
2010-05-05   21   36
2010-05-06    1    2
2010-05-07    6    7
...