создание столбцов среднемесячных значений в R - PullRequest
0 голосов
/ 07 мая 2020

У меня есть фрейм данных в R, где каждая строка соответствует домашнему хозяйству. Один столбец описывает дату в 2010 году, когда это домохозяйство выращивало урожай. Остальная часть набора данных содержит более 1000 столбцов, описывающих температуру каждый день в период с 2007 по 2010 год для этих домохозяйств.

Это основная форма c:

        Date 2007-01-01 2007-01-02 2007-01-03
1 2010-05-01         70         72         61
2 2010-02-10         63         59         73
3 2010-03-06         60         59         81

Мне нужно создать столбцы для каждого домохозяйства, которые описывают среднемесячные температуры за два месяца после даты посадки в каждом из за три года до 2010 года.

Например: если домашнее хозяйство высажено 01.05.2010, мне понадобятся следующие столбцы:

  • средняя температура 01.05.2007 по 2007-06-01
  • средняя температура с 2007-06-02 по 2007-07-01
  • средняя температура с 2008-05-01 по 2008-06-01

...

  • средняя температура с 02.06.2009 по 01.07.2009

Я пропустил две колонки, но вы понимаете . Код Specifi c был бы наиболее полезен, но в целом я просто ищу способ извлекать данные из определенных c столбцов на основе даты, описанной в другом столбце.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Привет, @bricevk, вы могли бы использовать функцию apply. Это позволяет вам использовать функцию для данных по столбцам или по строкам.

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/apply

Допустим, ваши данные находятся в объекте df. Он применяет функцию среднего к столбцам df. Даем вам среднее значение по столбцам. 2 указывает на столбцы. Это будет среднесуточное значение, если каждый столбец равен одному дню.

Averages <- apply(df,2,mean)

Если бы я не ответил на этот вопрос так, как вы хотели бы, возможно, я не совсем понял ваш набор данных. Не могли бы вы объяснить это более понятно?

0 голосов
/ 07 мая 2020

Предлагаю вам использовать тидиверс. Однако, чтобы быть совместимым с этой вселенной, вы сначала должны сделать ваши данные стандартными, ie аккуратными. В вашем примере все было бы проще, если бы вы преобразовали свои данные, чтобы ваши наблюдения упорядочивались по строкам, а столбцы были переменными. Если я правильно понял ваши данные, у вас есть домохозяйства, которые сажают деревья (названия строк - это даты посадки?), А затем контролируют температуру. Я бы сделал что-то вроде:

    -----------------------------------------------------------------------------
    | Household ID | planting date | Date of control | Temperature controlled |
    -----------------------------------------------------------------------------

во-первых, сохраните дату посадки как другое имя, а не имя, например:

     library(dplyr)
     df <- tibble::rownames_to_column(data, "PlantingDate")

Вы также должны получить свой домашний идентификатор var, который вы нам не указали. Затем вы можете управлять аккуратными данными с помощью tidyr, используя

     library(tidyr)
     df <- gather(df,"DateOfControl","Temperature",-c(PlantingDate,ID))

Когда у вас это будет, вы сможете использовать пакет lubridate, что-то вроде

     library(lubridate)
     df %>%
     group_by(ID,PlantingDate,year(ControlDate),month(ControlDate)) %>%
     summarise(MeanT=mean(Temperature))

может работать

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