【问题标题】:Removing NAs within groups across mulitple columns in R在 R 中跨多个列的组内删除 NA
【发布时间】:2020-05-12 21:39:26
【问题描述】:

我经常使用如下所示的时间序列数据集:

           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。

【问题讨论】:

    标签: r dplyr time-series na


    【解决方案1】:

    涉及zoodplyr 的解决方案可能是:

    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
    

    【讨论】:

      【解决方案2】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 2022-09-22
        • 1970-01-01
        • 2020-09-22
        • 2013-09-28
        相关资源
        最近更新 更多