删除R中多个列中的组内的NA

问题描述 投票:1回答:1

我经常使用看起来像这样的时间序列数据集:

           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个回答
0
投票

涉及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

0
投票
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)
© www.soinside.com 2019 - 2024. All rights reserved.