Есть ли функция в R, которая будет суммировать значения на основе даты года? - PullRequest
2 голосов
/ 11 февраля 2020

У меня есть таблица данных (Precip15), состоящая из столбцов осадков, даты года (DOY) и Date_Time в формате POSIXct. Мне нужно, чтобы я мог видеть общее количество осадков (Rain_cm) за каждый зарегистрированный день. Какие-либо предложения?

Пример формата таблицы данных выглядит следующим образом:

DOY     Rain     Rain_cm    Date_Time
179      6         0.6      2019-06-28 15:00:00
179      0         NA       2019-06-28 15:15:00
179      2         0.2      2019-06-28 16:45:00
180      0         NA       2019-06-29 10:00:00
180      10.2      1.2      2019-06-29 10:15:00
180      2         0.2      2019-06-29 13:00:00

Мне нужно, чтобы он выглядел так:

DOY     Rain_cm    
179     0.8      
180     1.4

или, возможно:

Date           Rain_cm
2019-06-28       0.8 
2019-06-29       1.4

Заранее спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020

Вот некоторые базовые решения R, использующие фрейм данных DF, который воспроизводимо определен в примечании в конце. Возможны также решения на основе пакетов dplyr, data.table или zoo.

1) агрегат aggregate на DOY или Date (определенный в transform утверждение ниже) в зависимости от того, что вы хотите. Обратите внимание, что aggregate автоматически удаляет строки с NA.

aggregate(Rain_cm ~ DOY, DF, sum)
##   DOY Rain_cm
## 1 179     0.8
## 2 180     1.4

DF2 <- transform(DF, Date = as.Date(Date_Time))
aggregate(Rain_cm ~ Date, DF2, sum)
##         Date Rain_cm
## 1 2019-06-28     0.8
## 2 2019-06-29     1.4

2) rowum Другое базовое решение R - это rowsum, возвращающий матрицу из одного столбца, в которой имена строк являются значением переменная группировки. DF2 от (1).

with(na.omit(DF), rowsum(Rain_cm, DOY))
##     [,1]
## 179  0.8
## 180  1.4

with(na.omit(DF2), rowsum(Rain_cm, Date))
##            [,1]
## 2019-06-28  0.8
## 2019-06-29  1.4

3) tapply Другой базовый подход R - tapply. Это создает именованный вектор цифр c. DF2 от (1).

with(DF, tapply(Rain_cm, DOY, sum, na.rm = TRUE))
## 179 180 
## 0.8 1.4 

with(DF2, tapply(Rain_cm, Date, sum, na.rm = TRUE))
## 2019-06-28 2019-06-29 
##        0.8        1.4

4) xtabs xtabs можно использовать для формирования xtabs table объекта. DF2 от (1).

xtabs(Rain_cm ~ DOY, DF)
## DOY
## 179 180 
## 0.8 1.4 

xtabs(Rain_cm ~ Date, DF2)
## Date
## 2019-06-28 2019-06-29 
##        0.8        1.4 

Примечание

Предполагается, что данные в воспроизводимой форме:

Lines <- "DOY     Rain     Rain_cm    Date_Time
179      6         0.6      2019-06-28 15:00:00
179      0         NA       2019-06-28 15:15:00
179      2         0.2      2019-06-28 16:45:00
180      0         NA       2019-06-29 10:00:00
180      10.2      1.2      2019-06-29 10:15:00
180      2         0.2      2019-06-29 13:00:00"
L <- readLines(textConnection(Lines))
DF <- read.csv(text = gsub("  +", ",", Lines))
0 голосов
/ 11 февраля 2020

Вы можете использовать функции aggregate и cut для расчета ваших общих суточных значений осадков. Следующий код предоставит вам желаемые результаты:

precipTotals <- aggreate(df$Rain_cm ~ cut(df$Date_Time, breaks = "day"), x = df, 
    FUN = sum, na.rm = TRUE)

Убедитесь, что столбцы отсеков as.numeric() и ваш Date_Time в формате as.POSIXct(), и это будет работать для вас.

0 голосов
/ 11 февраля 2020
df <- tribble(
    ~DOY,     ~Rain,     ~Rain_cm,    ~Date_Time
    , 179      , 6         , 0.6      , "2019-06-28 15:00:00"
    , 179      , 0         , NA       , "2019-06-28 15:15:00"
    , 179      , 2         , 0.2      , "2019-06-28 16:45:00"
    , 180      , 0         , NA       , "2019-06-29 10:00:00"
    , 180      , 10.2      , 1.2      , "2019-06-29 10:15:00"
    , 180      , 2         , 0.2      , "2019-06-29 13:00:00"
)

df %>%
    mutate(Date_Time = ymd_hms(Date_Time)) %>%
    mutate(Date = as.Date(Date_Time)) %>%
    group_by(Date) %>%
    summarise(perDate = sum(Rain_cm, na.rm = TRUE))

  Date       perDate
  <date>       <dbl>
1 2019-06-28     0.8
2 2019-06-29     1.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...