Traducción: Casos de uso para la función gather()

gather() funtzioa erabiltzeko kasuak

26 de noviembre de 2018

Duela egun batzuk @inesgnek honakoa komentatu zuen twitterren:

Twitterren bertan hainbat adibide aipatu nituen arren, gather() funtzioa erabil behar izan dudan hainbat kasu sakonxeago azaltzea egokia iruditu zait.

Lehen bi adibideak besteren datuekin lan egiten dugunean gertatu ohi dira bereziki (opendata webgune batean eskuratutako datuak, esaterako); azken adibidea desberdin samarra da, tidy formatua duten datuak berregituratzeko beharra sistema grafikoak berak ezartzen duelako, jatorrizko aldagaiak aldagai grafikoetara mapatu ahal izateko.

Azkenik, datuak laburtzeko gather() funtzioa beste funtzioekin batera nola erabili aipatuko dut.

Taula gurutzatuak

Besteren dauteikn lan egiten dugunean, ohikoa izaten da datuen laburpenekin lan egitea, eta ez jatorrizko datuekin. Halaber, datuak irakurterrazak izateko, ohikoa izaten da taula gurutzatuak erabiltzea; hauetan, aldagai bateko aldaerak taula berriko zutabe berriak izatera pasatzen dira. Adibide baterako, OpenData Euskadiko taula honi begiratu bat ematea besterik ez dugu: “ÍNDICES ANUALES DE PRECIOS PERCIBIDOS EN LOS SECTORES AGROFORESTAL Y PESQUERO”.

Zutabeen izenak zenbakiak dira; hortaz, arazorik gabe aukeratu ahal izateko, euren indizea erabiliko dugu.

library(tidyverse)
library(readxl)

# Excel fitxategia R-ra ekarri baino lehen, konbinatutako gelaxka guztiak banatu egin behar dira
taula <- read_excel("Precio_indagroforestpesca_9903.xls", range = cell_rows(8:30))

taula_berregituratua <- taula %>%
  gather(key=urtea, value=balioa, 2:7)

head(taula_berregituratua)
## # A tibble: 6 x 4
##   `Azpisectoreak / Grupo de Productos`        `Peso Relativo` urtea  balioa
##   <chr>                                                 <dbl> <chr>  <dbl>
## 1 Zerealak / Cereales (*)                                 0.2 1995     100
## 2 Lekadunak / leguminosas(*)                              0   1995     100
## 3 Tuberkuluak / Tuberculos (*)                            0.1 1995     100
## 4 Industri laboreak / Cultivos industriales ~             0.1 1995     100
## 5 Barazkiak / Hortalizas (*)                              0.2 1995     100
## 6 Fruituak / Frutas (*)                                   0   1995     100

Badira adibide korapilotsuagoak, taula gurutzatua bi aldagai baino gehiago oinarri hartuta egituratzen dutenak, Open Data Euskadi webguneko «Laneko jardunaldian gertatutako bajadun lan istripuen intzidentzia-indizea (milako hainbeste), hilabetean eta denboraldian 2017. urtean» hau esaterako (taula gurutzatua aldagai hauek gurutzatuta osatu da: lurraldea, sektorea, sezua, urtea eta indize mota).

Atik Brako ibilbideak

Hasiera eta amaiera puntua jasota duten ibilbideen datu-egiturak berregituratu behar izango ditugu, kasua kasu. Datu-bistaratzearen gaineko jardunaldietan datu hauek erabili izan ditut: Metro Share Bike (Los Ángeles).

library(tidyverse)
download.file("https://bikeshare.metro.net/wp-content/uploads/2018/10/metro-bike-are-trips-2018-q3.csv.zip", "ibilbideak.zip")
ibilbideak <- read_csv(unz("ibilbideak.zip","metro-bike-share-trips-2018-q3.csv"))

## Parsed with column specification:
## cols(
##   trip_id = col_integer(),
##   duration = col_integer(),
##   start_time = col_datetime(format = ""),
##   end_time = col_datetime(format = ""),
##   start_station = col_integer(),
##   start_lat = col_double(),
##   start_lon = col_double(),
##   end_station = col_integer(),
##   end_lat = col_double(),
##   end_lon = col_double(),
##   bike_id = col_character(),
##   plan_duration = col_integer(),
##   trip_route_category = col_character(),
##   passholder_type = col_character()
## )

as.tibble(ibilbideak)
## # A tibble: 95,283 x 14
##     trip_id duration start_time          end_time            start_station
##       <int>    <int> <dttm>              <dttm>                      <int>
##  1 94851140        8 2018-07-01 00:04:00 2018-07-01 00:12:00          3058
##  2 94851141        8 2018-07-01 00:04:00 2018-07-01 00:12:00          3058
##  3 94851138       15 2018-07-01 00:09:00 2018-07-01 00:24:00          4147
##  4 94851137        7 2018-07-01 00:22:00 2018-07-01 00:29:00          4157
##  5 94851136       35 2018-07-01 00:23:00 2018-07-01 00:58:00          3013
##  6 94851135        6 2018-07-01 00:38:00 2018-07-01 00:44:00          3029
##  7 94851134        5 2018-07-01 00:39:00 2018-07-01 00:44:00          3029
##  8 94857739       33 2018-07-01 00:40:00 2018-07-01 01:13:00          3069
##  9 94851133        6 2018-07-01 00:44:00 2018-07-01 00:50:00          3067
## 10 94851132        3 2018-07-01 00:46:00 2018-07-01 00:49:00          3034
## # ... with 95,273 more rows, and 9 more variables: start_lat <dbl>,
## #   start_lon <dbl>, end_station <int>, end_lat <dbl>, end_lon <dbl>,
## #   bike_id <chr>, plan_duration <int>, trip_route_category <chr>,
## #   passholder_type <chr>

ggplot2 paketearekin geom_segment() edo geom_curve() funtzioak erabili ditzakegu ibilbide bakoitza marra zuzen edo kurboatu batekin irudikatzeko. Horretarako, hasierako eta amaierako koordenatuak (latitudea eta longitudea) x, y, xend eta yend aldagaiekin mapatu besterik ez dugu.

ggplot(ibilbideak) +
    geom_segment(aes(x=start_lon, y=start_lat, xend=end_lon, yend=end_lat))
## Warning: Removed 2084 rows containing missing values (geom_segment).

geom_path edo geom_polygon funtzioak erabiltzeko aldiz, datuak berregituratu egin beharko ditugu, lerro bakoitzak puntu bakarrari buruzko informazioa izan dezan; bestalde, puntuak lerro bidez elkartzen ahalbidetuko duen aldagai berria beharko dugu (eta lerroak bi puntu baino gehiago elkartzen baditu, puntuen hurrenkera adierazteko beste aldagai bat ere beharko dugu).

gather() funtzioarekin batera honako operazioak egingo ditugu oinarrizko datu-egitura eskuratzeko:

  • Hasierako latitudea eta kongitudea batetik, eta amaierakoak bestetik kateatu.
  • geom_path() erabiltzeko behar ditugun hiru aldagaiak aukeratu.
  • gather() funtzioarekin hasierako eta amaierako koordenatuak pibotatu.
  • Datuak pibotatutakoan, latitudea eta longitudea berriro banatu.
  • Latitudea eta longitudea zenbakizko bihurtu.
ibilbideetako_puntuak <- ibilbideak %>%
  unite(hasierako_koordenatua, start_lat,start_lon,sep=";") %>%
  unite(amaierako_koordenatua, end_lat,end_lon,sep=";") %>%
  select(c("trip_id", "hasierako_koordenatua","amaierako_koordenatua")) %>%
  gather(key="puntua", value = koordenatuak, hasierako_koordenatua, amaierako_koordenatua) %>%
  separate(koordenatuak, c("latitudea", "longitudea"), sep=";") %>%
  mutate(latitudea = as.numeric(latitudea)) %>%
  mutate(longitudea = as.numeric(longitudea)) %>%
  arrange(trip_id)

## Warning in evalq(as.numeric(latitudea), <environment>): NAs introducidos por
## coerción
## Warning in evalq(as.numeric(longitudea), <environment>): NAs introducidos por
## coerción

as.tibble(ibilbideetako_puntuak)
## # A tibble: 190,566 x 4
##     trip_id puntua                  latitudea   longitudea
##       <int> <chr>                   <dbl>       <dbl>
##  1 94851130 hasierako_koordenatua   34.0        -118.
##  2 94851130 amaierako_koordenatua   34.1        -118.
##  3 94851131 hasierako_koordenatua   34.0        -118.
##  4 94851131 amaierako_koordenatua   34.1        -118.
##  5 94851132 hasierako_koordenatua   34.0        -118.
##  6 94851132 amaierako_koordenatua   34.0        -118.
##  7 94851133 hasierako_koordenatua   34.0        -118.
##  8 94851133 amaierako_koordenatua   34.0        -118.
##  9 94851134 hasierako_koordenatua   34.0        -118.
## 10 94851134 amaierako_koordenatua   34.0        -118.
## # ... with 190,556 more rows

ggplot(ibilbideetako_puntuak) +
    geom_path(aes(x=longitudea, y=latitudea, group = trip_id))
## Warning: Removed 1771 rows containing missing values (geom_path).

Adibide jakin honetan ez da beharrezkoa datuak berregituratzea; baina ibilbideak hiru puntu edo gehiago zeharkatzen baditu honelako egitura batera jo beharko dugu.

Aldagaiak «metaaldagai» grafiko bateko elementu gisa

Azkenik, gather() erabiltzeko beste kasuetako bat grafiko bakar batean ardatz batean hainbat aldagai bistaratu nahi ditugunean gertatzen da.

gather() funtzioaren laguntza-orriari erreparatzen badiogu honako adibidea topatuko duguvemos el siguiente ejemplo (gure adibidean, funtzioaren emaitza mini_iris_gathered objektuan gorde dugu, aurrerago ggplot()ekin erabili ahal izateko):

library(tidyverse)

# get first observation for each Species in iris data -- base R
mini_iris <- iris[c(1, 51, 101), ]

# gather Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
mini_iris_gathered <- gather(mini_iris, key = flower_att, value = measurement,
       Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)

Datuen egitura aldatu eta gero, aldagaiak X edo Y ardatzeko maila gisa erabiltzen dituzte grafikoak egin ahal izango ditugu, esate baterako paralela koordinatuen grafikoa (oharra: honako adibidea adibide soila da, erabilitako aldagaiek eskala bera erabiltzen dituelako, eta antzeko heina dute):

ggplot(mini_iris_gathered, aes(x=flower_att, y=measurement)) +
  geom_line(aes(group=Species, color=Species)) +
  geom_point(size=2, colour="grey50") +
  theme_classic() +
  theme(panel.grid.major.x = element_line(color = "black"))

heatmap motako grafikoek ere honelako transformazioa eskatzen dute. Adibide honetan reshape paketeko melt() funtzioa erabiltzen dute (gather() funtzioaren aurreko dorma bat): Heatmaps con ggplot2.

Datuak berregituratu nahi ez badituzu, grafiko jakinak sortzeko paketeak erabili ditzakezu: ComplexHEatmap nahiz ggparallel.

spread()

spread() funtzioak egitura estua berriro zabaltzeko balio du. Besteren datuak erabiltzerakoan ez dut funtzio honen beharrik izan, baina gather() funtzioarekin batera datuak laburtzeko baliagarria da. Adibide honetan spread(), gather(), group_by() eta summarise() datuak laburtzeko nola erabili zaltzen dute: (azken adibidea)


Post gehiago