Удаление NA внутри групп через несколько столбцов в R - PullRequest
1 голос
/ 27 января 2020

Я часто работаю с наборами данных временных рядов, которые выглядят так:

           CNGBOND. FRGBOND.
2006-02-15       NA     3.76
2006-03-31     4.26       NA
2006-05-15       NA     4.25
2006-06-30     4.69       NA
2006-08-15       NA     4.17
2006-09-29     4.08       NA
2006-11-15       NA     4.06
2006-12-29     4.11       NA

Я бы хотел сгруппировать строки в кварталы и удалить NA, чтобы получить:

        CNGBOND. FRGBOND.
2006 Q1     4.26     3.76
2006 Q2     4.69     4.25
2006 Q3     4.08     4.17
2006 Q4     4.11     4.06

Есть ли простой / элегантный способ добиться этого, предпочтительно с использованием конвейера dplyr?

Я подумал о преобразовании в кварталы (используя zoo:as.yearqtr), а затем о группировке по квартальным датам (используя dplyr::group_by), но затем застрял с тем, как отфильтровать NA для каждого столбца в каждой группе.

Ответы [ 2 ]

4 голосов
/ 27 января 2020

Одно решение с участием zoo и dplyr может быть:

df %>%
 rownames_to_column(var = "Date") %>%
 group_by(Date = as.yearqtr(Date, format = "%Y-%m-%d")) %>%
 summarise_all(~ na.omit(.))

  Date      CNGBOND. FRGBOND.
  <yearqtr>    <dbl>    <dbl>
1 2006 Q1       4.26     3.76
2 2006 Q2       4.69     4.25
3 2006 Q3       4.08     4.17
4 2006 Q4       4.11     4.06
1 голос
/ 27 января 2020
library(tidyverse)
library(lubridate)

df <- tribble(
    ~date, ~CNGBOND, ~FRGBOND
    , "2006-02-15",       NA,     3.76
    , "2006-03-31",     4.26,       NA
    , "2006-05-15",       NA,     4.25
    , "2006-06-30",     4.69,       NA
    , "2006-08-15",       NA,     4.17
    , "2006-09-29",     4.08,       NA
    , "2006-11-15",       NA,     4.06
    , "2006-12-29",     4.11,       NA

)

firstNonNA <- function(x) x[!is.na(x)][1]

df %>%
    mutate(date = ymd(date)) %>%
    mutate(Quarter = quarter(date, with_year = TRUE)) %>%
    group_by(Quarter) %>%
    summarise_at(vars(CNGBOND, FRGBOND), firstNonNA)
...