【问题标题】:How to join list of dataframes to one dataframe, using the DF / list indices?如何使用 DF / 列表索引将数据帧列表连接到一个数据帧?
【发布时间】:2018-06-29 21:46:10
【问题描述】:
library(dplyr); library(tibble)

这是我的示例数据。小数据框列表 (listOfDFs) 我想加入单个数据框 (points)。

listOfDfs 有 5 个小数据框,总共 7 行,points 是一个有 7 行的数据框:

points <- structure(list(EVENT_ID_CNTY = c("LBY1243", "LBY3389", "LBY3393", 
                    "LBY3506", "LBY3822"), year = c(2013, 2015, 2015, 2015, 2015), 
                    COUNTRY = c("Libya", "Libya", "Libya", "Libya", "Libya")), .Names = c("EVENT_ID_CNTY", 
                    "year", "COUNTRY"), row.names = c(NA, -5L), class = c("tbl_df", 
                    "tbl", "data.frame"))

listOfDFs <- structure(list(`1` = structure(list(CELL_ID = c(165267, 164547
), gwno = c(620L, 620L), POP = c(751.0737, 754.5745), prio_country = c("Libya", 
"Libya")), .Names = c("CELL_ID", "gwno", "POP", "prio_country"
), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"
)), `2` = structure(list(CELL_ID = 172475, gwno = 620L, POP = 11676, 
prio_country = "Libya"), .Names = c("CELL_ID", "gwno", "POP", 
"prio_country"), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame")), `3` = structure(list(CELL_ID = 172475, 
gwno = 620L, POP = 11676, prio_country = "Libya"), .Names = c("CELL_ID", 
"gwno", "POP", "prio_country"), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame")), `4` = structure(list(CELL_ID = 172475, 
gwno = 620L, POP = 11676, prio_country = "Libya"), .Names = c("CELL_ID", 
"gwno", "POP", "prio_country"), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame")), `5` = structure(list(CELL_ID = c(165267, 
164547), gwno = c(620L, 620L), POP = c(751.0737, 754.5745), prio_country = c("Libya", 
"Libya")), .Names = c("CELL_ID", "gwno", "POP", "prio_country"
), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"
))), .Names = c("1", "2", "3", "4", "5"))

这些数据如下所示:

points
#> # A tibble: 5 x 3
#>   EVENT_ID_CNTY  year COUNTRY
#>   <chr>         <dbl> <chr>  
#> 1 LBY1243       2013. Libya  # Corresponds to the two items in listOfDFs[[1]]
#> 2 LBY3389       2015. Libya  # Corresponds to the one item in listOfDFs[[2]]
#> 3 LBY3393       2015. Libya  
#> 4 LBY3506       2015. Libya  
#> 5 LBY3822       2015. Libya


listOfDFs
#> $`1`
#> # A tibble: 2 x 4
#>   CELL_ID  gwno   POP prio_country
#>     <dbl> <int> <dbl> <chr>       
#> 1 165267.   620  751. Libya       
#> 2 164547.   620  755. Libya       
#> 
#> $`2`
#> # A tibble: 1 x 4
#>   CELL_ID  gwno    POP prio_country
#>     <dbl> <int>  <dbl> <chr>       
#> 1 172475.   620 11676. Libya       
#> 
#> $`3`
#> # A tibble: 1 x 4
#>   CELL_ID  gwno    POP prio_country
#>     <dbl> <int>  <dbl> <chr>       
#> 1 172475.   620 11676. Libya       
#> 
#> $`4`
#> # A tibble: 1 x 4
#>   CELL_ID  gwno    POP prio_country
#>     <dbl> <int>  <dbl> <chr>       
#> 1 172475.   620 11676. Libya       
#> 
#> $`5`
#> # A tibble: 2 x 4
#>   CELL_ID  gwno   POP prio_country
#>     <dbl> <int> <dbl> <chr>       
#> 1 165267.   620  751. Libya       
#> 2 164547.   620  755. Libya

我如何加入这两个以使它们遵循以下模式?我必须找到一种方法将它们绑定到数据框的行索引上还是有更优雅的方法?:

#>   EVENT_ID_CNTY  year COUNTRY  CELL_ID  gwno   POP prio_country
#>   <chr>         <dbl> <chr>     <dbl> <int> <dbl> <chr>  
#>   LBY1243       2013. Libya     165267.   620  751. Libya 
#>   LBY1243       2013. Libya     164547.   620  755. Libya 
#>   LBY3389       2015. Libya     172475.   620 11676. Libya
#>   LBY3393       2015. Libya     172475.   620 11676. Libya
#>   LBY3506       2015. Libya     172475.   620 11676. Libya
#>   LBY3822       2015. Libya     165267.   620  751. Libya 
#>   LBY3822       2015. Libya     164547.   620  755. Libya
.........

【问题讨论】:

    标签: r dataframe join dplyr


    【解决方案1】:
    library(tidyr)
    points %>% mutate(mm=listOfDFs) %>% unnest
    
    # A tibble: 7 x 7
      EVENT_ID_CNTY  year COUNTRY CELL_ID  gwno    POP prio_country
      <chr>         <dbl> <chr>     <dbl> <int>  <dbl> <chr>       
    1 LBY1243        2013 Libya    165267   620   751. Libya       
    2 LBY1243        2013 Libya    164547   620   755. Libya       
    3 LBY3389        2015 Libya    172475   620 11676  Libya       
    4 LBY3393        2015 Libya    172475   620 11676  Libya       
    5 LBY3506        2015 Libya    172475   620 11676  Libya       
    6 LBY3822        2015 Libya    165267   620   751. Libya       
    7 LBY3822        2015 Libya    164547   620   755. Libya  
    

    【讨论】:

      【解决方案2】:

      基于示例,我们将“points”数据集的行与list 的每个元素的nrow 复制在一起,并将列绑定在一起

      library(tidyverse)
      bind_cols(points[rep(seq_len(nrow(points)),
             map_dbl(listOfDFs, nrow)),], bind_rows(listOfDFs))
      # A tibble: 7 x 7
      #EVENT_ID_CNTY  year COUNTRY CELL_ID  gwno    POP prio_country
      #   <chr>         <dbl> <chr>     <dbl> <int>  <dbl> <chr>       
      #1 LBY1243        2013 Libya    165267   620   751. Libya       
      #2 LBY1243        2013 Libya    164547   620   755. Libya       
      #3 LBY3389        2015 Libya    172475   620 11676  Libya       
      #4 LBY3393        2015 Libya    172475   620 11676  Libya       
      #5 LBY3506        2015 Libya    172475   620 11676  Libya       
      #6 LBY3822        2015 Libya    165267   620   751. Libya       
      #7 LBY3822        2015 Libya    164547   620   755. Libya    
      

      或者在链中使用

      map_dbl(listOfDFs, nrow) %>% 
            rep(seq_len(nrow(points)), .) %>%
            magrittr::extract(points, ., ) %>%
            bind_cols(bind_rows(listOfDFs))
      

      或者将list的名称设置为'EVENT_ID_CNTY'来创建一个id列并加入'points'

      listOfDFs %>% 
          set_names(points$EVENT_ID_CNTY) %>% 
          bind_rows(.id = 'EVENT_ID_CNTY') %>% 
          left_join(points)
      

      【讨论】:

        【解决方案3】:

        使用dplyr::bind_rowsdplyr::inner_join 的选项可以是:

        library(dplyr)
        
        mutate(points, rn = as.character(row_number())) %>%
          inner_join(bind_rows(listOfDFs, .id="Name"), by=c("rn" = "Name")) %>%
          select(-rn)
        
        # # A tibble: 7 x 7
        # EVENT_ID_CNTY  year COUNTRY CELL_ID  gwno   POP prio_country
        # <chr>         <dbl> <chr>     <dbl> <int> <dbl> <chr>       
        # 1 LBY1243        2013 Libya    165267   620   751 Libya       
        # 2 LBY1243        2013 Libya    164547   620   755 Libya       
        # 3 LBY3389        2015 Libya    172475   620 11676 Libya       
        # 4 LBY3393        2015 Libya    172475   620 11676 Libya       
        # 5 LBY3506        2015 Libya    172475   620 11676 Libya       
        # 6 LBY3822        2015 Libya    165267   620   751 Libya       
        # 7 LBY3822        2015 Libya    164547   620   755 Libya
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-12
          • 1970-01-01
          • 2022-01-24
          • 2021-07-25
          • 2017-06-27
          • 1970-01-01
          相关资源
          最近更新 更多