Dplyr õpetus: ühendage ja ühendage andmed R-is koos näidetega

Sissejuhatus andmeanalüüsi

Andmete analüüsi võib jagada kolme ossa:

  • Kaevandamine: Esiteks peame koguma andmeid paljudest allikatest ja ühendama need.
  • Muutma: see samm hõlmab andmete töötlemist. Kui oleme kõik andmeallikad koondanud, saame hakata andmeid puhastama.
  • Visualiseerima: Viimane samm on meie andmete visualiseerimine, et kontrollida eeskirjade eiramist.
Andmete analüüsi protsess
Andmete analüüsi protsess

Üks olulisemaid väljakutseid, millega andmeteadlased silmitsi seisavad, on andmetega manipuleerimine. Andmed pole kunagi soovitud vormingus saadaval. Andmeteadlased peavad kulutama vähemalt poole oma ajast andmete puhastamisele ja nendega manipuleerimisele. See on töö üks kriitilisemaid ülesandeid. Kui andmete töötlemise protsess ei ole täielik, täpne ja range, ei tööta mudel õigesti.

R Dplyr

R-l on andmete teisendamisel abiks teek nimega dplyr. Teek dplyr on põhimõtteliselt loodud nelja funktsiooniga andmetega manipuleerimiseks ja viie verbi ümber andmete puhastamiseks. Pärast seda saame andmete analüüsimiseks ja visualiseerimiseks kasutada ggploti teeki.

Õpime, kuidas kasutada dplyr teeki a manipuleerimiseks Andmeraam.

Ühendage andmed R Dplyriga

dplyr pakub kena ja mugava viisi andmehulkade kombineerimiseks. Meil võib olla palju sisendandmete allikaid ja mingil hetkel peame need kombineerima. Ühendus dplyr-ga lisab muutujad algsest andmekogumist paremale.

Dplyr liitub

Järgnevalt on toodud neli olulist liitumistüüpi, mida dplyr-is kasutatakse kahe andmestiku liitmiseks.

funktsioon Eesmärk Argumendid Mitu klahvi
left_join() Ühendage kaks andmekogumit. Säilita kõik vaatlused päritolutabelist andmed, päritolu, sihtkoht, = "ID" päritolu, sihtkoht, = c(“ID”, “ID2”)
right_join() Ühendage kaks andmekogumit. Hoidke kõik vaatlused sihttabelist alles andmed, päritolu, sihtkoht, = "ID" päritolu, sihtkoht, = c(“ID”, “ID2”)
inner_join() Ühendage kaks andmekogumit. Välistab kõik sobimatud read andmed, päritolu, sihtkoht, = "ID" päritolu, sihtkoht, = c(“ID”, “ID2”)
full_join() Ühendage kaks andmekogumit. Säilitab kõik tähelepanekud andmed, päritolu, sihtkoht, = "ID" päritolu, sihtkoht, = c(“ID”, “ID2”)

Uurime kõiki liitetüüpe lihtsa näite abil.

Esiteks koostame kaks andmekogumit. Tabel 1 sisaldab kahte muutujat, ID ja y, samas kui tabelis 2 on ID ja z. Igas olukorras peab meil olema a võtmepaar muutuv. Meie puhul on ID meie võti muutuv. Funktsioon otsib mõlemas tabelis identseid väärtusi ja seob tagastatavad väärtused tabelist 1 paremale.

Ühendage andmed R Dplyriga

library(dplyr)
df_primary <- tribble(
  ~ID, ~y,
   "A", 5,
   "B", 5,
   "C", 8,
   "D", 0,
  "F", 9)
df_secondary <- tribble(
  ~ID, ~z,
   "A", 30,
   "B", 21,
   "C", 22,
   "D", 25,
   "E", 29)

Dplyr left_join()

Kõige tavalisem viis kahe andmestiku liitmiseks on funktsiooni left_join() kasutamine. Allolevalt pildilt näeme, et võtmepaar sobib ideaalselt mõlema andmestiku ridadega A, B, C ja D. E ja F jäävad aga üle. Kuidas me neid kahte tähelepanekut käsitleme? Funktsiooni left_join() abil säilitame kõik muutujad algses tabelis ja ei võta arvesse muutujaid, millel pole sihttabelis võtmepaari. Meie näites ei ole muutujat E tabelis 1 olemas. Seetõttu jäetakse rida välja. Muutuja F pärineb lähtetabelist; seda hoitakse alles pärast left_join() ja tagastab NA veerus z. Alloleval joonisel on näha, mis juhtub parameetriga left_join().

Näide dplyr left_join()

Näide dplyr left_join()

left_join(df_primary, df_secondary, by ='ID')

Väljund:

## 
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>		
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA

Dplyr right_join()

Funktsioon right_join() töötab täpselt nagu left_join(). Ainus erinevus on see, et rida on maha jäetud. Sihtandmeraamis saadaval olev väärtus E on uues tabelis olemas ja võtab veeru y väärtuse NA.

Näide dplyr right_join()

Näide dplyr right_join()

right_join(df_primary, df_secondary, by = 'ID')

Väljund:

##
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     E    NA    29

Dplyr inner_join()

Kui oleme 100% kindlad, et need kaks andmekogumit ei ühti, võime kaaluda naasmist ainult olemasolevad read mõlemad andmestik. See on võimalik, kui vajame puhast andmestikku või kui me ei soovi puuduvaid väärtusi omistada keskmise või mediaaniga.

Inner_join() tuleb appi. See funktsioon välistab sobimatud read.

dplyr inner_join() näide

dplyr inner_join() näide

inner_join(df_primary, df_secondary, by ='ID')

Väljund:

## 
# A tibble: 4 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25

Dplyr full_join()

Lõpuks säilitab funktsioon full_join() kõik vaatlused ja asendab puuduvad väärtused NA-ga.

Näide dplyr full_join()

Näide dplyr full_join()

full_join(df_primary, df_secondary, by = 'ID')

Väljund:

## # A tibble: 6 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA
## 6     E    NA    29

Mitu võtmepaari

Viimaseks, kuid mitte vähem tähtsaks, võib meie andmekogus olla mitu võtit. Mõelge järgmisele andmekogumile, kus meil on aastaarvud või kliendi ostetud toodete loend.

Mitu võtmepaari R-s

Kui proovime mõlemat tabelit liita, annab R vea. Olukorra parandamiseks saame edastada kaks võtmepaari muutujat. See tähendab ID ja aasta, mis kuvatakse mõlemas andmekogumis. Tabeli 1 ja tabeli 2 ühendamiseks saame kasutada järgmist koodi

df_primary <- tribble(
  ~ID, ~year, ~items,
  "A", 2015,3,
  "A", 2016,7,
  "A", 2017,6,
  "B", 2015,4,
  "B", 2016,8,
  "B", 2017,7,
  "C", 2015,4,
  "C", 2016,6,
  "C", 2017,6)
df_secondary <- tribble(
  ~ID, ~year, ~prices,
  "A", 2015,9,
  "A", 2016,8,
  "A", 2017,12,
  "B", 2015,13,
  "B", 2016,14,
  "B", 2017,6,
  "C", 2015,15,
  "C", 2016,15,
  "C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))

Väljund:

## # A tibble: 9 x 4
##      ID  year items prices
##   <chr> <dbl> <dbl>  <dbl>
## 1     A  2015     3      9
## 2     A  2016     7      8
## 3     A  2017     6     12
## 4     B  2015     4     13
## 5     B  2016     8     14
## 6     B  2017     7      6
## 7     C  2015     4     15
## 8     C  2016     6     15
## 9     C  2017     6     13

Andmete puhastamise funktsioonid R-is

Andmete korrastamiseks (puhastamiseks) on järgmised neli olulist funktsiooni:

funktsioon Eesmärk Argumendid
koguma () Muutke andmed laiast pikaks (andmed, võti, väärtus, na.rm = VÄÄR)
levik() Muutke andmed pikkadest laiadeks (andmed, võti, väärtus)
eralda () Jagage üks muutuja kaheks (andmed, veerg, into, sep= "", eemalda = TRUE)
ühik() Ühendage kaks muutujat üheks (data, col, conc ,sep= "", eemalda = TRUE)

Kasutame tidyr raamatukogu. See teek kuulub andmetega manipuleerimiseks, puhastamiseks ja visualiseerimiseks raamatukogu kogusse. Kui installime R koos anacondaga, on teek juba installitud. Raamatukogu leiame siit, https://anaconda.org/r/r-tidyr.

Kui pole veel installitud, sisestage tidyr installimiseks järgmine käsk:

install tidyr : install.packages("tidyr")

koguma ()

Funktsiooni kogumis() eesmärk on muuta andmed laiast pikaks.

Süntaks

gather(data, key, value, na.rm = FALSE)
Arguments:
-data: The data frame used to reshape the dataset 
-key: Name of the new column created
-value: Select the columns used to fill the key column
-na.rm: Remove missing values. FALSE by default

Näide

Allpool saame visualiseerida laiast pikaks ümberkujundamise kontseptsiooni. Soovime luua ühe veeru nimega kasv, mis on täidetud kvartalimuutujate ridadega.

Näide kogumis() funktsioonist R-is

library(tidyr)
# Create a messy dataset
messy <- data.frame(
  country = c("A", "B", "C"),
  q1_2017 = c(0.03, 0.05, 0.01),
  q2_2017 = c(0.05, 0.07, 0.02),
  q3_2017 = c(0.04, 0.05, 0.01),
  q4_2017 = c(0.03, 0.02, 0.04))
messy

Väljund:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04
# Reshape the data
tidier <-messy %>%
gather(quarter, growth, q1_2017:q4_2017)
tidier

Väljund:

##    country quarter growth
## 1        A q1_2017   0.03
## 2        B q1_2017   0.05
## 3        C q1_2017   0.01
## 4        A q2_2017   0.05
## 5        B q2_2017   0.07
## 6        C q2_2017   0.02
## 7        A q3_2017   0.04
## 8        B q3_2017   0.05
## 9        C q3_2017   0.01
## 10       A q4_2017   0.03
## 11       B q4_2017   0.02
## 12       C q4_2017   0.04

Funktsioonis collection() loome kaks uut muutujat kvartal ja kasv, kuna meie algsel andmekogumil on üks rühmamuutuja: riik ja võtme-väärtuste paarid.

levik()

Funktsioon spread() toimib kogumisele vastupidiselt.

Süntaks

spread(data, key, value)
arguments: 
data: The data frame used to reshape the dataset
key: Column to reshape long to wide
value: Rows used to fill the new column

Näide

Saame korrektsema andmestiku uuesti segaseks muuta funktsiooniga spread()

# Reshape the data
messy_1 <- tidier %>%
  spread(quarter, growth) 
messy_1

Väljund:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04

eralda ()

Funktsioon separat () jagab veeru kaheks vastavalt eraldajale. See funktsioon on abiks mõnes olukorras, kus muutujaks on kuupäev. Meie analüüs võib nõuda keskendumist kuule ja aastale ning me tahame veeru eraldada kaheks uueks muutujaks.

Süntaks

separate(data, col, into, sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: The column to split
-into: The name of the new variables
-sep: Indicates the symbol used that separates the variable, i.e.:  "-", "_", "&"
-remove: Remove the old column. By default sets to TRUE.

Näide

Saame kvartali jaotada aastast korrastatud andmekogumis, rakendades funktsiooni separation().

separate_tidier <-tidier %>%
separate(quarter, c("Qrt", "year"), sep ="_")
head(separate_tidier)

Väljund:

##   country Qrt year growth
## 1       A  q1 2017   0.03
## 2       B  q1 2017   0.05
## 3       C  q1 2017   0.01
## 4       A  q2 2017   0.05
## 5       B  q2 2017   0.07
## 6       C  q2 2017   0.02

ühenda ()

Funktsioon unite() ühendab kaks veergu üheks.

Süntaks

unit(data, col, conc ,sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: Name of the new column
-conc: Name of the columns to concatenate
-sep: Indicates the symbol used that unites the variable, i.e:  "-", "_", "&"
-remove: Remove the old columns. By default, sets to TRUE

Näide

Ülaltoodud näites eraldasime kvartali aastast. Mis siis, kui tahame need ühendada. Kasutame järgmist koodi:

unit_tidier <- separate_tidier %>%
  unite(Quarter, Qrt, year, sep ="_")
head(unit_tidier)

Väljund:

##   country Quarter growth
## 1       A q1_2017   0.03
## 2       B q1_2017   0.05
## 3       C q1_2017   0.01
## 4       A q2_2017   0.05
## 5       B q2_2017   0.07
## 6       C q2_2017   0.02

kokkuvõte

  • Andmete analüüs saab jagada kolmeks osaks: ekstraheerimine, teisendus ja visualiseerimine.
  • R-l on andmete teisendamisel abiks teek nimega dplyr. Teek dplyr on põhimõtteliselt loodud nelja funktsiooniga andmetega manipuleerimiseks ja viie verbi ümber andmete puhastamiseks.
  • dplyr pakub kena ja mugava viisi andmehulkade kombineerimiseks. Ühendus dplyr-ga lisab muutujad algsest andmekogumist paremale.
  • Dplyri ilu seisneb selles, et see käsitleb nelja tüüpi ühendusi, mis on sarnased SQL:
    • left_join() – Kahe andmekogumi ühendamiseks ja kõikide vaatluste säilitamiseks lähtetabelist.
    • right_join() – Kahe andmestiku liitmiseks ja sihttabelist kõigi vaatluste säilitamiseks.
    • inner_join() – Kahe andmestiku liitmiseks ja kõigi sobimatute ridade välistamiseks.
    • full_join() – Kahe andmekogumi ühendamiseks ja kõigi vaatluste säilitamiseks.
  • Tidyr Library abil saate andmestiku teisendada järgmiste funktsioonide abil.
    • koguma (): teisendage andmed laiast pikaks.
    • levik(): teisendage andmed pikkadest laiadeks.
    • eralda (): jagage üks muutuja kaheks.
    • ühik(): ühendage kaks muutujat üheks.