агрегация объектов зоопарка

#r #dataframe #zoo

#r #фрейм данных #зоопарк

Вопрос:

Уважаемое сообщество,

данные, которые я получаю, будут находиться во фрейме данных:

 Var_1      Var_2         Date        VaR_3  VaR_4   VaR_5   Var_6
1           4       2010-01-18         7    apple    10    sweet
2           5       2010-07-19         8    orange   11    sour
3           6       2010-01-18         9    kiwi     12    juicy
...        ...      ...               ...   ...     ...    ... 
  

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

Вопросы:

  1. Учитывая приведенные выше данные в виде фрейма данных, какой метод рекомендуется для преобразования полного df в объект zoo, сообщая zoo, что он должен использовать третий столбец в качестве столбца даты (даты могут встречаться в данных несколько раз)?
  2. Как мне агрегировать все остальные столбцы ежемесячно, кроме столбцов 4 и 6, используя встроенные функции zoo? Может ли zoo автоматически отбрасывать категориальные переменные и использовать только те столбцы, которые подходят для агрегации?
  3. Как мне агрегировать все числовые столбцы ежемесячно для каждой категории в столбце 4 (столбец 6 не должен включаться, поскольку он не числовой).

Спасибо за вашу поддержку.

Комментарии:

1. Похоже, работает для вопроса 1: df.z<-read.zoo(df,index.column= 3,aggregate= F)

Ответ №1:

объекты зоопарка представляют собой временные ряды и обычно являются числовыми векторами или матрицами. Похоже, что на самом деле у вас есть набор разных временных рядов, где в столбце 5 указывается, какой это ряд. То есть существует серия apple, серия orange, серия kiwi и т. Д., И у каждого из них есть несколько столбцов.

Отбрасывая последний столбец, поскольку он не числовой, используя третий столбец в качестве индекса и разделяя столбец 5, мы имеем:

 # create test data
Lines <- "Var_1      Var_2         Date        VaR_3  VaR_4   VaR_5   Var_6
1           4       2010-01-18         7    apple    10    sweet
2           5       2010-07-19         8    orange   11    sour
3           6       2010-01-18         9    kiwi     12    juicy"
cat(Lines, "n", file = "data.txt")

library(zoo)
z <- read.zoo("data.txt", header = TRUE, index = 3, split = "VaR_5",
  colClasses = c(Var_6 = "NULL"))
  

Результатом является:

 > z
           Var_1.apple Var_2.apple VaR_3.apple VaR_5.apple Var_1.kiwi
2010-01-18           1           4           7          10          3
2010-07-19          NA          NA          NA          NA         NA
           Var_2.kiwi VaR_3.kiwi VaR_5.kiwi Var_1.orange Var_2.orange
2010-01-18          6          9         12           NA           NA
2010-07-19         NA         NA         NA            2            5
           VaR_3.orange VaR_5.orange
2010-01-18           NA           NA
2010-07-19            8           11
  

Вышеизложенное предполагает, что для заданного значения столбца 5 даты уникальны. Если это не так, то включите aggregate = mean аргумент или какое-либо другое значение для aggregate .

Чтобы теперь объединить его в ежемесячную серию zoo, у нас есть:

 aggregate(z, as.yearmon, mean)
  

Также можно было бы сразу преобразовать его в ежемесячный, используя FUN = as.yearmon аргумент:

 zm <- read.zoo("data.txt", header = TRUE, index = "Date", split = "VaR_4", 
  FUN = as.yearmon, colClasses = c(Var_6 = "NULL"), aggregate = mean)
  

См ?read.zoo . , vignette("zoo-read") , ?aggregate.zoo а также другие виньетки и файлы справки.

Комментарии:

1. Уважаемый Габор, спасибо за ваш ответ и продуманные предложения. На самом деле мой набор данных более сложный. Для примера я уменьшил фрейм данных таким образом, чтобы он отображал наиболее важные свойства. Какой столбец для разделения будет использоваться, неизвестно. Существует еще много столбцов, содержащих либо числа, либо категории. Используя ваш метод, мне приходится сортировать их вручную, когда я хочу выполнить агрегацию по объекту zoo. Есть ли способ использовать логический тест для каждого столбца таким образом, чтобы он суммировал и сохранял только те столбцы объекта zoo, которые содержат числовые данные?

2. Чтобы уточнить немного больше: на первом шаге я хотел бы агрегировать, как описано, по всем данным. Вторым шагом будет разделение по категориям. Существует вероятность того, что для каждой категории встречаются записи на одну и ту же дату. Однако это должно быть нормально, поскольку в большинстве случаев я хотел бы определить только сумму, среднее и абсолютное количество отсчетов за каждый месяц.

3. Я думаю, вы предполагаете, что объект имеет числовые и нечисловые столбцы. объекты зоопарка основаны на векторах или матрицах и не могут содержать смеси разных классов. В этом случае все они должны быть числовыми. Неясно, что вы подразумеваете под тем, какой столбец разделить, неизвестно. В конце концов, вам нужно будет знать, что это такое. Вы можете считывать данные в data.frame и использовать read.zoo во фрейме данных (первый аргумент read.zoo может быть фреймом данных). Это можно сделать несколько раз с разными разделениями, чтобы получить разные объекты зоопарка, если хотите.

4. «зоопарк … не может содержать смеси разных классов»: если я использую df.z<-read.zoo(df,index.column=3,aggregate= F) во фрейме данных, не содержит ли он все столбцы примера и, следовательно, является смесью?

5. Ваш второй комментарий «В конце концов, вам нужно будет узнать, что это такое» верен, но это после того, как я провел все исследования данных, и я не знаю, до какой из них, наконец, будет использоваться. Поэтому на первом шаге я хочу агрегировать все данные, как описано. Мой вопрос все еще остается открытым: «Есть ли способ использовать логический тест для каждого столбца таким образом, чтобы он суммировал и сохранял только те столбцы объекта zoo (полученные из фрейма данных), которые содержат числовые данные?»