【问题标题】:R: create or delete rows given a range of values [duplicate]R:在给定值范围内创建或删除行[重复]
【发布时间】:2021-11-19 01:53:20
【问题描述】:

我有下一个包含国家、年份和 GDP 的数据库:

我有什么

Country Year GDP
Afghanistan 1950 $123
Afghanistan 1951 $123
Afghanistan 2019 $123
Australia 1945 $123
Australia 2021 $123

我需要创建或删除行,以便每个国家/地区都有从 1948 年到 2021 年的行。因此,例如,对于阿富汗,我需要创建 1948 年到 1949 年和 2021 年的行,GDP 为空,而对于澳大利亚,删除1945 行并在其间创造一切。

这不是我的确切数据库,我有 200 多个国家/地区,每个国家/地区都有不同的年份。有没有办法轻松创建?

我需要什么

Country Year GDP
Afghanistan 1948 NA
... ... ...
Afghanistan 2021 NA
Australia 1948 $123
... ... ...
Australia 2021 $123

【问题讨论】:

    标签: r dataframe panel-data


    【解决方案1】:

    我们可以使用complete 来创建缺失的组合并将GDP 指定为0

    library(tidyr)
    complete(df1, Country, Year = 1948:2021, list(GDP = 0)) %>%
        arrange(Country)
    

    【讨论】:

      【解决方案2】:

      我们可以使用complete,然后是filter,最后是replace_na

      library(dplyr)
      
      
      df <-read.table(header=TRUE, text="Country  Year    GDP
      Afghanistan 1950    $123
      Afghanistan 1951    $123
      Afghanistan 2019    $123
      Australia   1945    $123
      Australia   2021    $123")
      
      
      df <- df %>% 
        complete(Year = 1948:2021, Country) %>%
        filter(between(Year, 1948, 2021)) %>%
        replace_na(list(GDP = 0)) %>%
        arrange(Country)
      
      head(df)
      tail(df)
       
      > print(head(df))
      # A tibble: 6 x 3
         Year Country     GDP  
        <int> <chr>       <chr>
      1  1948 Afghanistan 0    
      2  1949 Afghanistan 0    
      3  1950 Afghanistan $123 
      4  1951 Afghanistan $123 
      5  1952 Afghanistan 0    
      6  1953 Afghanistan 0    
      > print(tail(df))
      # A tibble: 6 x 3
         Year Country   GDP  
        <int> <chr>     <chr>
      1  2016 Australia 0    
      2  2017 Australia 0    
      3  2018 Australia 0    
      4  2019 Australia 0    
      5  2020 Australia 0    
      6  2021 Australia $123 
      

      reprex package (v2.0.1) 于 2021-09-26 创建

      【讨论】:

        【解决方案3】:
        library(tidyr)
        library(dplyr)
        
        df <-
          tibble::tribble(
                 ~Country, ~Year,   ~GDP,
            "Afghanistan", 1950L, "$123",
            "Afghanistan", 1951L, "$123",
            "Afghanistan", 2019L, "$123",
              "Australia", 1945L, "$123",
              "Australia", 2021L, "$123"
            )
        
        df %>% 
          filter(Year >= 1948 & Year <= 2021) %>% 
          complete(Year = 1948:2021,Country) %>% 
          arrange(Country)
        
        # A tibble: 148 x 3
            Year Country     GDP  
           <int> <chr>       <chr>
         1  1948 Afghanistan NA   
         2  1949 Afghanistan NA   
         3  1950 Afghanistan $123 
         4  1951 Afghanistan $123 
         5  1952 Afghanistan NA   
         6  1953 Afghanistan NA   
         7  1954 Afghanistan NA   
         8  1955 Afghanistan NA   
         9  1956 Afghanistan NA   
        10  1957 Afghanistan NA   
        # ... with 138 more rows
        

        【讨论】:

          【解决方案4】:

          这是completecoalesce 的解决方案

          library(dplyr)
          library(tidyr)
          df %>% 
            complete(Year = 1948:2021, Country) %>% 
            arrange(Country, Year) %>% 
            mutate(GDP = coalesce(GDP, "0"))
          
          # A tibble: 149 x 3
              Year Country     GDP  
             <int> <chr>       <chr>
           1  1948 Afghanistan 0    
           2  1949 Afghanistan 0    
           3  1950 Afghanistan $123 
           4  1951 Afghanistan $123 
           5  1952 Afghanistan 0    
           6  1953 Afghanistan 0    
           7  1954 Afghanistan 0    
           8  1955 Afghanistan 0    
           9  1956 Afghanistan 0    
          10  1957 Afghanistan 0    
          # … with 139 more rows
          

          【讨论】:

            猜你喜欢
            • 2019-10-30
            • 2012-01-03
            • 2020-03-02
            • 1970-01-01
            • 2020-04-12
            • 1970-01-01
            • 2018-04-30
            • 1970-01-01
            • 2022-11-04
            相关资源
            最近更新 更多