Fuzionarea eficientă a mai multor seturi de date | R-BLOGGERS

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe pacha.dev/blogși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)


Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.

Din cauza întârzierilor cu plata bursei mele, dacă această postare vă este utilă, vă cer cu drag o donație minimă pentru a -mi cumpăra o cafea care va fi folosită pentru a continua eforturile mele open source. Dacă aveți nevoie de un pachet R sau un tablou de bord strălucitor pentru echipa dvs., puteți să -mi trimiteți un e -mail sau să întrebați pe Fiverr. Explicația completă este aici: un mesaj personal de la un contribuabil open source

Puteți să -mi trimiteți întrebări pentru blog folosind acest formular și să vă abonați pentru a primi un e -mail atunci când există o nouă postare.

Am tendința să observ că elevii mei repetă mult cod atunci când avem date partiționate pe diferite tabele. De exemplu, atunci când trebuie să citim mai multe fișiere CSV care duc la o structură similară cu următoarele tabele create prin subsectarea intenționată

library(palmerpenguins)
Attaching package: 'palmerpenguins'
The following objects are masked from 'package:datasets':

    penguins, penguins_raw
library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(purrr)

species <- penguins %>%
  distinct(species) %>%
  pull()

map(
  species,
  function(s) {
    assign(
      paste0("penguins_", tolower(s)),
      filter(penguins, species == s),
      envir = .GlobalEnv
    )
  }
)
((1))
# A tibble: 152 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                                 
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 142 more rows
# ℹ 2 more variables: sex , year 

((2))
# A tibble: 124 × 8
   species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                              
 1 Gentoo  Biscoe           46.1          13.2               211        4500
 2 Gentoo  Biscoe           50            16.3               230        5700
 3 Gentoo  Biscoe           48.7          14.1               210        4450
 4 Gentoo  Biscoe           50            15.2               218        5700
 5 Gentoo  Biscoe           47.6          14.5               215        5400
 6 Gentoo  Biscoe           46.5          13.5               210        4550
 7 Gentoo  Biscoe           45.4          14.6               211        4800
 8 Gentoo  Biscoe           46.7          15.3               219        5200
 9 Gentoo  Biscoe           43.3          13.4               209        4400
10 Gentoo  Biscoe           46.8          15.4               215        5150
# ℹ 114 more rows
# ℹ 2 more variables: sex , year 

((3))
# A tibble: 68 × 8
   species   island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                                
 1 Chinstrap Dream            46.5          17.9               192        3500
 2 Chinstrap Dream            50            19.5               196        3900
 3 Chinstrap Dream            51.3          19.2               193        3650
 4 Chinstrap Dream            45.4          18.7               188        3525
 5 Chinstrap Dream            52.7          19.8               197        3725
 6 Chinstrap Dream            45.2          17.8               198        3950
 7 Chinstrap Dream            46.1          18.2               178        3250
 8 Chinstrap Dream            51.3          18.2               197        3750
 9 Chinstrap Dream            46            18.9               195        4150
10 Chinstrap Dream            51.3          19.9               198        3700
# ℹ 58 more rows
# ℹ 2 more variables: sex , year 
penguins_adelie
# A tibble: 152 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                                 
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 142 more rows
# ℹ 2 more variables: sex , year 
penguins_chinstrap
# A tibble: 68 × 8
   species   island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                                
 1 Chinstrap Dream            46.5          17.9               192        3500
 2 Chinstrap Dream            50            19.5               196        3900
 3 Chinstrap Dream            51.3          19.2               193        3650
 4 Chinstrap Dream            45.4          18.7               188        3525
 5 Chinstrap Dream            52.7          19.8               197        3725
 6 Chinstrap Dream            45.2          17.8               198        3950
 7 Chinstrap Dream            46.1          18.2               178        3250
 8 Chinstrap Dream            51.3          18.2               197        3750
 9 Chinstrap Dream            46            18.9               195        4150
10 Chinstrap Dream            51.3          19.9               198        3700
# ℹ 58 more rows
# ℹ 2 more variables: sex , year 
penguins_gentoo
# A tibble: 124 × 8
   species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                              
 1 Gentoo  Biscoe           46.1          13.2               211        4500
 2 Gentoo  Biscoe           50            16.3               230        5700
 3 Gentoo  Biscoe           48.7          14.1               210        4450
 4 Gentoo  Biscoe           50            15.2               218        5700
 5 Gentoo  Biscoe           47.6          14.5               215        5400
 6 Gentoo  Biscoe           46.5          13.5               210        4550
 7 Gentoo  Biscoe           45.4          14.6               211        4800
 8 Gentoo  Biscoe           46.7          15.3               219        5200
 9 Gentoo  Biscoe           43.3          13.4               209        4400
10 Gentoo  Biscoe           46.8          15.4               215        5150
# ℹ 114 more rows
# ℹ 2 more variables: sex , year 

O operațiune comună pe care am văzut -o când elevii mei folosesc DPlyr este o variație a acestui lucru:

penguins_adelie %>%
  bind_rows(penguins_chinstrap) %>% 
  bind_rows(penguins_gentoo)
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                                 
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex , year 
bind_rows(penguins_adelie, penguins_chinstrap, penguins_gentoo)
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                                 
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex , year 

Un model similar apare atunci când decid să folosească baza r cu ceva de genul acesta

rbind(penguins_adelie, penguins_chinstrap, penguins_gentoo)
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                                 
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex , year 

Există multe modalități de a obține același rezultat în R, iar o opțiune este utilizarea operatorului „{}”:

# either
{penguins_adelie; penguins_chinstrap; penguins_gentoo} %>%
  list() %>%
  bind_rows()
# A tibble: 124 × 8
   species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                              
 1 Gentoo  Biscoe           46.1          13.2               211        4500
 2 Gentoo  Biscoe           50            16.3               230        5700
 3 Gentoo  Biscoe           48.7          14.1               210        4450
 4 Gentoo  Biscoe           50            15.2               218        5700
 5 Gentoo  Biscoe           47.6          14.5               215        5400
 6 Gentoo  Biscoe           46.5          13.5               210        4550
 7 Gentoo  Biscoe           45.4          14.6               211        4800
 8 Gentoo  Biscoe           46.7          15.3               219        5200
 9 Gentoo  Biscoe           43.3          13.4               209        4400
10 Gentoo  Biscoe           46.8          15.4               215        5150
# ℹ 114 more rows
# ℹ 2 more variables: sex , year 
# or
{
  penguins_adelie
  penguins_chinstrap
  penguins_gentoo
} %>%
  bind_rows()
# A tibble: 124 × 8
   species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
                                              
 1 Gentoo  Biscoe           46.1          13.2               211        4500
 2 Gentoo  Biscoe           50            16.3               230        5700
 3 Gentoo  Biscoe           48.7          14.1               210        4450
 4 Gentoo  Biscoe           50            15.2               218        5700
 5 Gentoo  Biscoe           47.6          14.5               215        5400
 6 Gentoo  Biscoe           46.5          13.5               210        4550
 7 Gentoo  Biscoe           45.4          14.6               211        4800
 8 Gentoo  Biscoe           46.7          15.3               219        5200
 9 Gentoo  Biscoe           43.3          13.4               209        4400
10 Gentoo  Biscoe           46.8          15.4               215        5150
# ℹ 114 more rows
# ℹ 2 more variables: sex , year 

Exemplele anterioare devin rapid nepractice atunci când aveți de -a face cu un număr mare de seturi de date. În astfel de cazuri, putem folosi purrr Pachet pentru a eficientiza procesul.

Un exemplu practic este datele ONU Comtrade, care sunt partiționate de țară și an în mii de fișiere CSV (la un moment dat i -am salvat pe cele RDS pentru a salva spațiul pe disc). Folosind map_df Pentru a îmbina eficient mai multe seturi de date fără a repeta codul, putem face următoarele:

# list Canadian data 1990-1999
canada_files <- list.files("~/Documents/uncomtrade/input/data", pattern = "_CAN_199",
  full.names = TRUE)

head(canada_files)

canada <- map_df(
  canada_files,
  readRDS
)

canada

> canada
# A tibble: 1,971,197 × 34
   dataset_code      type_code freq_code ref_period_id ref_year ref_month period
                                             
 1 20124199001052100 C         A         19900101      1990     52        1990  
 2 20124199001052100 C         A         19900101      1990     52        1990  
 3 20124199001052100 C         A         19900101      1990     52        1990  
 4 20124199001052100 C         A         19900101      1990     52        1990  
 5 20124199001052100 C         A         19900101      1990     52        1990  
 6 20124199001052100 C         A         19900101      1990     52        1990  
 7 20124199001052100 C         A         19900101      1990     52        1990  
 8 20124199001052100 C         A         19900101      1990     52        1990  
 9 20124199001052100 C         A         19900101      1990     52        1990  
10 20124199001052100 C         A         19900101      1990     52        1990  
# ℹ 1,971,187 more rows
# ℹ 27 more variables: reporter_code , flow_code ,
#   partner_code , partner2code , classification_search_code ,
#   classification_code , is_original_classification ,
#   cmd_code , customs_code , mos_code , mot_code ,
#   qty_unit_code , qty , is_qty_estimated ,
#   alt_qty_unit_code , alt_qty , is_alt_qty_estimated , …
# ℹ Use `print(n = ...)` to see more rows

Apoi, este posibil să se efectueze diferite operații, cum ar fi exporturile bilaterale totale care raportează FOB și CIF pentru a vedea nepotrivirea dintre exportator și importator:

canada %>%
  select(partner_code, fobvalue, cifvalue) %>%
  mutate(
    fobvalue = as.numeric(fobvalue),
    cifvalue = as.numeric(cifvalue)
  ) %>%
  group_by(partner_code) %>%
  summarise(
    fobvalue = sum(fobvalue, na.rm = TRUE),
    cifvalue = sum(cifvalue, na.rm = TRUE)
  )

> canada %>%
+   select(partner_code, fobvalue, cifvalue) %>%
+   mutate(
+     fobvalue = as.numeric(fobvalue),
+     cifvalue = as.numeric(cifvalue)
+   ) %>%
+   group_by(partner_code) %>%
+   summarise(
+     fobvalue = sum(fobvalue, na.rm = TRUE),
+     cifvalue = sum(cifvalue, na.rm = TRUE)
+   )
# A tibble: 219 × 3
   partner_code fobvalue cifvalue
                  
 1 0             1.34e13        0
 2 100           1.44e 9        0
 3 104           4.18e 8        0
 4 108           2.58e 7        0
 5 112           1.26e 8        0
 6 116           1.77e 8        0
 7 12            2.22e10        0
 8 120           7.34e 8        0
 9 132           6.95e 6        0
10 136           2.32e 8        0
# ℹ 209 more rows
# ℹ Use `print(n = ...)` to see more rows

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.