【问题标题】:Repeat rows based on time values split across multiple columns - R根据跨多列拆分的时间值重复行 - R
【发布时间】:2020-07-17 06:33:17
【问题描述】:

我正在尝试根据月份和年份值重复行。

目前,我的 df 看起来像这样:

Country Date    Year   Month
Angola  1/2008  2008    1
Angola  6/2020  2020    6
Benin   1/2013  2013    1
Benin   6/2020  2020    6
Benin   7/2014  2014    7

对于每个国家/地区,我想重复观察结果,使 df 看起来像这样:

Country Year   Month
Angola  2008    1
Angola  2008    2
Angola  2008    3
Angola  2008    4
Angola  2008    5
Angola  2008    6

etc... all the way until 06/2020 for Angola

有一个非常优雅的解决方案可以根据值重复行 (from this post)。如果我仅根据年份重复行,则解决方案的语法将如下所示:

df<-df %>%
  mutate(Year = readr::parse_number(Year)) %>% 
  group_by(Country)  %>%
  complete(Year =min(Year):max(Year))  

但是,我想重复时间范围,不仅基于年份,还基于月份。我还没有找到一个很好的方法来调整这种语法来做到这一点。我尝试将 Date 变量解析为日期,然后根据该日期重复,但这会为变量分配一个日期,并且重复行的次数远远超过我需要的次数。

df<-df %>% 
  mutate(Date = readr::parse_datetime(Date)) %>% 
  group_by(Country)  %>%
  complete(Date =min(Date):max(Date))  

关于如何做到这一点的任何想法?更愿意调整我一直在尝试的语法,但也对新的可能性持开放态度

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们删除Date 列,按“国家”分组后,使用complete 和“年”和“月”序列

    library(dplyr)
    out <- df1 %>% 
       select(-Date) %>% 
       mutate(Month2 = Month) %>% 
       group_by(Country) %>% 
       complete(Year = min(Year):max(Year), Month = first(Month):12) %>% 
       fill(Month2) %>%
       filter(Year == max(Year) & Month <= last(Month2)| Year != max(Year)) %>%
       select(-Month2)
    out
    # A tibble: 240 x 3
    # Groups:   Country [2]
    #   Country  Year Month
    #   <chr>   <int> <int>
    # 1 Angola   2008     1
    # 2 Angola   2008     2
    # 3 Angola   2008     3
    # 4 Angola   2008     4
    # 5 Angola   2008     5
    # 6 Angola   2008     6
    # 7 Angola   2008     7
    # 8 Angola   2008     8
    # 9 Angola   2008     9
    #10 Angola   2008    10
    # … with 231 more rows
    

    -检查输出

    -头

    out %>%
       filter(Country == 'Angola') %>% 
       head(14)
    # A tibble: 14 x 3
    # Groups:   Country [1]
       Country  Year Month
       <chr>   <int> <int>
     1 Angola   2008     1
     2 Angola   2008     2
     3 Angola   2008     3
     4 Angola   2008     4
     5 Angola   2008     5
     6 Angola   2008     6
     7 Angola   2008     7
     8 Angola   2008     8
     9 Angola   2008     9
    10 Angola   2008    10
    11 Angola   2008    11
    12 Angola   2008    12
    13 Angola   2009     1
    14 Angola   2009     2
    

    -尾巴

    out %>%
       filter(Country == 'Angola') %>% 
       tail(10)
    # A tibble: 10 x 3
    # Groups:   Country [1]
       Country  Year Month
       <chr>   <int> <int>
     1 Angola   2019     9
     2 Angola   2019    10
     3 Angola   2019    11
     4 Angola   2019    12
     5 Angola   2020     1
     6 Angola   2020     2
     7 Angola   2020     3
     8 Angola   2020     4
     9 Angola   2020     5
    10 Angola   2020     6
    

    数据

    df1 <- structure(list(Country = c("Angola", "Angola", "Benin", "Benin", 
    "Benin"), Date = c("1/2008", "6/2020", "1/2013", "6/2020", "7/2014"
    ), Year = c(2008L, 2020L, 2013L, 2020L, 2014L), Month = c(1L, 
    6L, 1L, 6L, 7L)), class = "data.frame", row.names = c(NA, -5L
    ))
    

    【讨论】:

    • 我原来的救星又回来了!我遇到的问题是这段代码在去年的月份结束,而不是一直持续到当年的 12 月。我将在原帖中发布更好的解释
    • @YuNa。你需要Month = min(Month):12。您的预期输出仅显示 6 行,所以我不确定
    • 这就像一个魅力!抱歉耽搁了,我正在尝试理解使用 fillfilter 的行
    • @YuNa 你不需要fill,只使用max(Year, na.rm = TRUE)。我只是使用fillNA 元素替换为以前的非NA
    • @YuNa 在这种情况下,使用last(Month2) 而不是max(Month2)
    【解决方案2】:
    library(tidyverse)
    
    df <- tibble(
      Country = c("Angola", "Angola", "Benin", "Benin", "Benin"),
      Date = c("1/2008", "6/2020", "1/2013", "6/2020", "7/2014"),
      Year = c(2008, 2020, 2013, 2020, 2014),
      Month = c(1,6,1,6,7))
    
    
    df %>%
      group_by(Country) %>%
      mutate(Date = lubridate::dmy(paste("1", Date))) %>%
      select(-Month, - Year) %>%
      complete(Date = seq(min(Date), max(Date), by = "months"))
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2016-02-10
      • 2020-06-27
      • 2013-12-03
      • 2017-11-08
      相关资源
      最近更新 更多