Как объединить список фреймов данных в один фрейм данных, используя индексы DF / list? - PullRequest
0 голосов
/ 30 июня 2018
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
.........

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Опцией использования dplyr::bind_rows и dplyr::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
0 голосов
/ 30 июня 2018
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  
0 голосов
/ 30 июня 2018

На основе примера мы копируем строки набора данных 'points' с nrow каждого элемента list и связываем столбцы вместе

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', чтобы создать столбец идентификатора и объединить с 'points'

listOfDFs %>% 
    set_names(points$EVENT_ID_CNTY) %>% 
    bind_rows(.id = 'EVENT_ID_CNTY') %>% 
    left_join(points)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...