ProHoster > Blog > Administrazioa > Zutabe habiaratuak zabaltzea - R hizkuntza erabiliz zerrendak (tidyr paketea eta unnest familiako funtzioak)
Zutabe habiaratuak zabaltzea - R hizkuntza erabiliz zerrendak (tidyr paketea eta unnest familiako funtzioak)
Kasu gehienetan, API batetik jasotako erantzun batekin edo zuhaitz-egitura konplexua duen beste edozein daturekin lan egiten duzunean, JSON eta XML formatuekin aurkitzen zara.
Formatu hauek abantaila asko dituzte: datuak nahiko trinko gordetzen dituzte eta beharrezkoak ez diren informazioa bikoiztea ekiditeko aukera ematen dute.
Formatu hauen desabantaila prozesatzeko eta aztertzeko konplexutasuna da. Egituratu gabeko datuak ezin dira erabili kalkuluetan eta bistaratzea ezin da bertan eraiki.
Artikulu hau argitalpenaren jarraipen logikoa da "R paketea tidyr eta bere funtzio berriak pivot_longer eta pivot_wider". Egituratu gabeko datu-egiturak paketea erabiliz analisi-taula-forma ezagun eta egoki batean ekartzen lagunduko dizu tidyr, liburutegiaren muinean sartuta tidyverse, eta bere funtzio-familia unnest_*().
Edukia
Datuen analisia interesatzen bazaizu, baliteke nirea interesatzea telegrama и youtube kanalak. Eduki gehienak R hizkuntzari eskainitakoak dira.
Laukizuzena(Itzultzailearen oharra, ez dut termino honetarako itzulpen aukera egokirik aurkitu, beraz, bere horretan utziko dugu.) habiaratutako matrizeekin egituratu gabeko datuak errenkada eta zutabe ezagunez osatutako bi dimentsioko taula batera ekartzeko prozesua da. IN tidyr Hainbat funtzio daude habiaratutako zerrendako zutabeak zabaltzen eta datuak forma angeluzuzen eta tabular batera murrizten lagunduko dizutenak:
unnest_longer() zutabeen zerrendako elementu bakoitza hartzen du eta errenkada berri bat sortzen du.
unnest_wider() zutabeen zerrendako elementu bakoitza hartzen du eta zutabe berri bat sortzen du.
unnest_auto() automatikoki zehazten du zein funtzio erabili behar den egokiena unnest_longer() edo unnest_wider().
hoist() antzekoak unnest_wider() baina zehaztutako osagaiak soilik hautatzen ditu eta hainbat habia mailarekin lan egiteko aukera ematen du.
Bi dimentsioko taula batean hainbat habia-maila dituzten egituratu gabeko datuak ekartzearekin lotutako arazo gehienak zerrendatutako funtzioak dplyr-ekin konbinatuz konpondu daitezke.
Teknika hauek erakusteko, paketea erabiliko dugu repurrrsive, web API batetik eratorritako hainbat mailatako zerrenda konplexu eta konplexuak eskaintzen dituena.
Dezagun hasteko gh_erabiltzaileak, GitHub-eko sei erabiltzaileri buruzko informazioa duen zerrenda. Lehenik eta behin, alda dezagun zerrenda gh_erabiltzaileak в tible markoa:
users <- tibble( user = gh_users )
Honek apur bat kontrakoa dirudi: zergatik eman zerrenda bat gh_erabiltzaileak, datu-egitura konplexuago batera? Baina datu-markoak abantaila handia du: bektore anitz konbinatzen ditu, dena objektu batean jarraitzeko.
Objektu-elementu bakoitza users elementu bakoitzak zutabe bat adierazten duen zerrenda izendun bat da.
Kasu honetan, 30 zutabez osatutako taula bat dugu, eta horietako gehienak ez ditugu beharko, beraz, horren ordez unnest_wider() erabiltzea hoist(). hoist() aukeratutako osagaiak ateratzeko aukera ematen digu sintaxi bera erabiliz purrr::pluck():
users %>% hoist(user,
followers = "followers",
login = "login",
url = "html_url"
)
#> # A tibble: 6 x 4
#> followers login url user
#> <int> <chr> <chr> <list>
#> 1 303 gaborcsardi https://github.com/gaborcsardi <named list [27]>
#> 2 780 jennybc https://github.com/jennybc <named list [27]>
#> 3 3958 jtleek https://github.com/jtleek <named list [27]>
#> 4 115 juliasilge https://github.com/juliasilge <named list [27]>
#> 5 213 leeper https://github.com/leeper <named list [27]>
#> 6 34 masalmon https://github.com/masalmon <named list [27]>
hoist() zehaztutako osagaiak zutabe-zerrendatik kentzen ditu erabiltzaileberaz, kontuan izan dezakezu hoist() osagaiak data-marko baten barne-zerrendatik goi-mailara eramatea bezala.
Github biltegiak
Zerrenda lerrokatzea gh_repos era berean hasten gara bihurtuz tibble:
Oraingoan elementuak erabiltzaile erabiltzaile honen jabetzako biltegien zerrenda irudikatu. Biltegi bakoitza behaketa bereizia da, beraz, datu txukunaren kontzeptuaren arabera (gutxi gorabehera datu txukunak) lerro berriak bihurtu beharko lirateke, horregatik erabiltzen dugu unnest_longer() eta ez unnest_wider():
repos <- repos %>% unnest_longer(repo)
repos
#> # A tibble: 176 x 1
#> repo
#> <list>
#> 1 <named list [68]>
#> 2 <named list [68]>
#> 3 <named list [68]>
#> 4 <named list [68]>
#> 5 <named list [68]>
#> 6 <named list [68]>
#> 7 <named list [68]>
#> 8 <named list [68]>
#> 9 <named list [68]>
#> 10 <named list [68]>
#> # … with 166 more rows
Orain erabil dezakegu unnest_wider() edo hoist() :
repos %>% hoist(repo,
login = c("owner", "login"),
name = "name",
homepage = "homepage",
watchers = "watchers_count"
)
#> # A tibble: 176 x 5
#> login name homepage watchers repo
#> <chr> <chr> <chr> <int> <list>
#> 1 gaborcsardi after <NA> 5 <named list [65]>
#> 2 gaborcsardi argufy <NA> 19 <named list [65]>
#> 3 gaborcsardi ask <NA> 5 <named list [65]>
#> 4 gaborcsardi baseimports <NA> 0 <named list [65]>
#> 5 gaborcsardi citest <NA> 0 <named list [65]>
#> 6 gaborcsardi clisymbols "" 18 <named list [65]>
#> 7 gaborcsardi cmaker <NA> 0 <named list [65]>
#> 8 gaborcsardi cmark <NA> 0 <named list [65]>
#> 9 gaborcsardi conditions <NA> 0 <named list [65]>
#> 10 gaborcsardi crayon <NA> 52 <named list [65]>
#> # … with 166 more rows
Erreparatu erabilerari c("owner", "login"): Honi esker, bigarren mailako balioa lortuko dugu habiaratutako zerrenda batetik owner. Ikuspegi alternatibo bat zerrenda osoa lortzea da owner eta gero funtzioa erabiliz unnest_wider() jarri bere elementu bakoitza zutabe batean:
Funtzio egokia aukeratzean pentsatu beharrean unnest_longer() edo unnest_wider() erabil dezakezu unnest_auto(). Funtzio honek hainbat metodo heuristiko erabiltzen ditu datuak eraldatzeko funtzio egokiena hautatzeko, eta aukeratutako metodoari buruzko mezu bat bistaratzen du.
got_chars egitura berdina du gh_users: Zerrenda izendunen multzoa da, non barneko zerrendako elementu bakoitzak Game of Thrones pertsonaia baten atributuren bat deskribatzen duen. Ekartzen got_chars Taularen ikuspegirako, data marko bat sortzen hasten gara, aurreko adibideetan bezala, eta gero elementu bakoitza zutabe bereizi batean bihurtzen dugu:
chars <- tibble(char = got_chars)
chars
#> # A tibble: 30 x 1
#> char
#> <list>
#> 1 <named list [18]>
#> 2 <named list [18]>
#> 3 <named list [18]>
#> 4 <named list [18]>
#> 5 <named list [18]>
#> 6 <named list [18]>
#> 7 <named list [18]>
#> 8 <named list [18]>
#> 9 <named list [18]>
#> 10 <named list [18]>
#> # … with 20 more rows
chars2 <- chars %>% unnest_wider(char)
chars2
#> # A tibble: 30 x 18
#> url id name gender culture born died alive titles aliases father
#> <chr> <int> <chr> <chr> <chr> <chr> <chr> <lgl> <list> <list> <chr>
#> 1 http… 1022 Theo… Male Ironbo… In 2… "" TRUE <chr … <chr [… ""
#> 2 http… 1052 Tyri… Male "" In 2… "" TRUE <chr … <chr [… ""
#> 3 http… 1074 Vict… Male Ironbo… In 2… "" TRUE <chr … <chr [… ""
#> 4 http… 1109 Will Male "" "" In 2… FALSE <chr … <chr [… ""
#> 5 http… 1166 Areo… Male Norvos… In 2… "" TRUE <chr … <chr [… ""
#> 6 http… 1267 Chett Male "" At H… In 2… FALSE <chr … <chr [… ""
#> 7 http… 1295 Cres… Male "" In 2… In 2… FALSE <chr … <chr [… ""
#> 8 http… 130 Aria… Female Dornish In 2… "" TRUE <chr … <chr [… ""
#> 9 http… 1303 Daen… Female Valyri… In 2… "" TRUE <chr … <chr [… ""
#> 10 http… 1319 Davo… Male Wester… In 2… "" TRUE <chr … <chr [… ""
#> # … with 20 more rows, and 7 more variables: mother <chr>, spouse <chr>,
#> # allegiances <list>, books <list>, povBooks <list>, tvSeries <list>,
#> # playedBy <list>
Egitura got_chars baino zailagoa gh_users, zeren zerrendako osagai batzuk char beraiek zerrenda bat dira, ondorioz zutabeak - zerrendak lortzen ditugu:
Zure ekintza gehiago analisiaren helburuen araberakoak dira. Beharbada pertsonaia agertzen den liburu eta serie bakoitzeko lerroetan informazioa jarri beharko zenuke:
chars2 %>%
select(name, books, tvSeries) %>%
pivot_longer(c(books, tvSeries), names_to = "media", values_to = "value") %>%
unnest_longer(value)
#> # A tibble: 180 x 3
#> name media value
#> <chr> <chr> <chr>
#> 1 Theon Greyjoy books A Game of Thrones
#> 2 Theon Greyjoy books A Storm of Swords
#> 3 Theon Greyjoy books A Feast for Crows
#> 4 Theon Greyjoy tvSeries Season 1
#> 5 Theon Greyjoy tvSeries Season 2
#> 6 Theon Greyjoy tvSeries Season 3
#> 7 Theon Greyjoy tvSeries Season 4
#> 8 Theon Greyjoy tvSeries Season 5
#> 9 Theon Greyjoy tvSeries Season 6
#> 10 Tyrion Lannister books A Feast for Crows
#> # … with 170 more rows
Edo agian pertsonaia eta lana lotzeko aukera ematen duen taula bat sortu nahi duzu:
chars2 %>%
select(name, title = titles) %>%
unnest_longer(title)
#> # A tibble: 60 x 2
#> name title
#> <chr> <chr>
#> 1 Theon Greyjoy Prince of Winterfell
#> 2 Theon Greyjoy Captain of Sea Bitch
#> 3 Theon Greyjoy Lord of the Iron Islands (by law of the green lands)
#> 4 Tyrion Lannister Acting Hand of the King (former)
#> 5 Tyrion Lannister Master of Coin (former)
#> 6 Victarion Greyjoy Lord Captain of the Iron Fleet
#> 7 Victarion Greyjoy Master of the Iron Victory
#> 8 Will ""
#> 9 Areo Hotah Captain of the Guard at Sunspear
#> 10 Chett ""
#> # … with 50 more rows
(Kontuan izan balio hutsak "" eremuan title, datuak sartzerakoan egindako akatsengatik gertatzen da got_chars: hain zuzen ere, eremuan dagozkien liburu eta telesailen izenbururik ez duten pertsonaiak title 0 luzerako bektore bat izan behar du, ez kate hutsa duen 1 luzerako bektore bat.)
Goiko adibidea funtzioa erabiliz berridatz dezakegu unnest_auto(). Ikuspegi hau komenigarria da behin-behineko azterketa egiteko, baina ez zenuke fidatu behar unnest_auto() aldizka erabiltzeko. Kontua da zure datuen egitura aldatzen bada unnest_auto() hautatutako datuak eraldatzeko mekanismoa alda dezake hasieran zerrendako zutabeak errenkadatan zabaldu baditu erabiliz unnest_longer(), orduan, sarrerako datuen egitura aldatzen denean, logika alde alda daiteke unnest_wider(), eta ikuspegi hori etengabe erabiltzeak ustekabeko akatsak sor ditzake.
tibble(char = got_chars) %>%
unnest_auto(char) %>%
select(name, title = titles) %>%
unnest_auto(title)
#> Using `unnest_wider(char)`; elements have 18 names in common
#> Using `unnest_longer(title)`; no element has names
#> # A tibble: 60 x 2
#> name title
#> <chr> <chr>
#> 1 Theon Greyjoy Prince of Winterfell
#> 2 Theon Greyjoy Captain of Sea Bitch
#> 3 Theon Greyjoy Lord of the Iron Islands (by law of the green lands)
#> 4 Tyrion Lannister Acting Hand of the King (former)
#> 5 Tyrion Lannister Master of Coin (former)
#> 6 Victarion Greyjoy Lord Captain of the Iron Fleet
#> 7 Victarion Greyjoy Master of the Iron Victory
#> 8 Will ""
#> 9 Areo Hotah Captain of the Guard at Sunspear
#> 10 Chett ""
#> # … with 50 more rows
Google-rekin geokodetzea
Jarraian, Google-ren geokodetze zerbitzutik lortutako datuen egitura konplexuagoa ikusiko dugu. Cachean gordetzeko kredentzialak Google maps APIarekin lan egiteko arauen aurkakoa da, beraz, lehenik eta behin APIaren inguruan bilgarri sinple bat idatziko dut. Google Maps API gakoa ingurune-aldagai batean gordetzean oinarritzen dena; Zure ingurune-aldagaietan Google Maps APIarekin lan egiteko gakoa ez baduzu gordeta, atal honetan aurkezten diren kode zatiak ez dira exekutatuko.
has_key <- !identical(Sys.getenv("GOOGLE_MAPS_API_KEY"), "")
if (!has_key) {
message("No Google Maps API key found; code chunks will not be run")
}
# https://developers.google.com/maps/documentation/geocoding
geocode <- function(address, api_key = Sys.getenv("GOOGLE_MAPS_API_KEY")) {
url <- "https://maps.googleapis.com/maps/api/geocode/json"
url <- paste0(url, "?address=", URLencode(address), "&key=", api_key)
jsonlite::read_json(url)
}
Funtzio honek itzultzen duen zerrenda nahiko konplexua da:
Zorionez, datu hauek taula formatuan bihurtzeko arazoa konpon dezakegu urratsez urrats funtzioak erabiliz tidyr. Zeregin apur bat erronka eta errealistagoa izan dadin, hiri batzuk geokodetzen hasiko naiz:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Lortutako emaitza bihurtuko dut tibble, erosotasunerako, dagokion hiriaren izena duen zutabe bat gehituko dut.
loc <- tibble(city = city, json = city_geo)
loc
#> # A tibble: 5 x 2
#> city json
#> <chr> <list>
#> 1 Houston <named list [2]>
#> 2 LA <named list [2]>
#> 3 New York <named list [2]>
#> 4 Chicago <named list [2]>
#> 5 Springfield <named list [2]>
Lehen mailak osagaiak ditu status и result, zabal dezakegunarekin unnest_wider() :
loc %>%
unnest_wider(json)
#> # A tibble: 5 x 3
#> city results status
#> <chr> <list> <chr>
#> 1 Houston <list [1]> OK
#> 2 LA <list [1]> OK
#> 3 New York <list [1]> OK
#> 4 Chicago <list [1]> OK
#> 5 Springfield <list [1]> OK
Kontuan izan results maila anitzeko zerrenda bat da. Hiri gehienek elementu 1 dute (geokodetze APIari dagokion balio bakarra adierazten duena), baina Springfield-ek bi ditu. Lerro bereizietara tira ditzakegu unnest_longer() :
loc %>%
unnest_wider(json) %>%
unnest_longer(results)
#> # A tibble: 5 x 3
#> city results status
#> <chr> <list> <chr>
#> 1 Houston <named list [5]> OK
#> 2 LA <named list [5]> OK
#> 3 New York <named list [5]> OK
#> 4 Chicago <named list [5]> OK
#> 5 Springfield <named list [5]> OK
Orain denek osagai berdinak dituzte, erabiliz egiaztatu daitezkeenak unnest_wider():
loc %>%
unnest_wider(json) %>%
unnest_longer(results) %>%
unnest_wider(results)
#> # A tibble: 5 x 7
#> city address_componen… formatted_addre… geometry place_id types status
#> <chr> <list> <chr> <list> <chr> <lis> <chr>
#> 1 Houst… <list [4]> Houston, TX, USA <named … ChIJAYWN… <lis… OK
#> 2 LA <list [4]> Los Angeles, CA… <named … ChIJE9on… <lis… OK
#> 3 New Y… <list [3]> New York, NY, U… <named … ChIJOwg_… <lis… OK
#> 4 Chica… <list [4]> Chicago, IL, USA <named … ChIJ7cv0… <lis… OK
#> 5 Sprin… <list [5]> Springfield, MO… <named … ChIJP5jI… <lis… OK
Hiri bakoitzaren latitude eta longitudearen koordenatuak aurki ditzakegu zerrenda zabalduz geometry:
loc %>%
unnest_wider(json) %>%
unnest_longer(results) %>%
unnest_wider(results) %>%
unnest_wider(geometry)
#> # A tibble: 5 x 10
#> city address_compone… formatted_addre… bounds location location_type
#> <chr> <list> <chr> <list> <list> <chr>
#> 1 Hous… <list [4]> Houston, TX, USA <name… <named … APPROXIMATE
#> 2 LA <list [4]> Los Angeles, CA… <name… <named … APPROXIMATE
#> 3 New … <list [3]> New York, NY, U… <name… <named … APPROXIMATE
#> 4 Chic… <list [4]> Chicago, IL, USA <name… <named … APPROXIMATE
#> 5 Spri… <list [5]> Springfield, MO… <name… <named … APPROXIMATE
#> # … with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> # status <chr>
Eta gero zabaldu behar duzun kokapena location:
loc %>%
unnest_wider(json) %>%
unnest_longer(results) %>%
unnest_wider(results) %>%
unnest_wider(geometry) %>%
unnest_wider(location)
#> # A tibble: 5 x 11
#> city address_compone… formatted_addre… bounds lat lng location_type
#> <chr> <list> <chr> <list> <dbl> <dbl> <chr>
#> 1 Hous… <list [4]> Houston, TX, USA <name… 29.8 -95.4 APPROXIMATE
#> 2 LA <list [4]> Los Angeles, CA… <name… 34.1 -118. APPROXIMATE
#> 3 New … <list [3]> New York, NY, U… <name… 40.7 -74.0 APPROXIMATE
#> 4 Chic… <list [4]> Chicago, IL, USA <name… 41.9 -87.6 APPROXIMATE
#> 5 Spri… <list [5]> Springfield, MO… <name… 37.2 -93.3 APPROXIMATE
#> # … with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> # status <chr>
Berriz ere, unnest_auto() Deskribatutako eragiketa errazten du sarrerako datuen egitura aldatzeak sor ditzakeen arrisku batzuekin:
loc %>%
unnest_auto(json) %>%
unnest_auto(results) %>%
unnest_auto(results) %>%
unnest_auto(geometry) %>%
unnest_auto(location)
#> Using `unnest_wider(json)`; elements have 2 names in common
#> Using `unnest_longer(results)`; no element has names
#> Using `unnest_wider(results)`; elements have 5 names in common
#> Using `unnest_wider(geometry)`; elements have 4 names in common
#> Using `unnest_wider(location)`; elements have 2 names in common
#> # A tibble: 5 x 11
#> city address_compone… formatted_addre… bounds lat lng location_type
#> <chr> <list> <chr> <list> <dbl> <dbl> <chr>
#> 1 Hous… <list [4]> Houston, TX, USA <name… 29.8 -95.4 APPROXIMATE
#> 2 LA <list [4]> Los Angeles, CA… <name… 34.1 -118. APPROXIMATE
#> 3 New … <list [3]> New York, NY, U… <name… 40.7 -74.0 APPROXIMATE
#> 4 Chic… <list [4]> Chicago, IL, USA <name… 41.9 -87.6 APPROXIMATE
#> 5 Spri… <list [5]> Springfield, MO… <name… 37.2 -93.3 APPROXIMATE
#> # … with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> # status <chr>
Hiri bakoitzeko lehen helbidea ere ikus dezakegu:
loc %>%
unnest_wider(json) %>%
hoist(results, first_result = 1) %>%
unnest_wider(first_result) %>%
unnest_wider(geometry) %>%
unnest_wider(location)
#> # A tibble: 5 x 11
#> city address_compone… formatted_addre… bounds lat lng location_type
#> <chr> <list> <chr> <list> <dbl> <dbl> <chr>
#> 1 Hous… <list [4]> Houston, TX, USA <name… 29.8 -95.4 APPROXIMATE
#> 2 LA <list [4]> Los Angeles, CA… <name… 34.1 -118. APPROXIMATE
#> 3 New … <list [3]> New York, NY, U… <name… 40.7 -74.0 APPROXIMATE
#> 4 Chic… <list [4]> Chicago, IL, USA <name… 41.9 -87.6 APPROXIMATE
#> 5 Spri… <list [5]> Springfield, MO… <name… 37.2 -93.3 APPROXIMATE
#> # … with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> # status <chr>
Edo erabili hoist() maila anitzeko urpekaritza zuzenean joateko lat и lng.
loc %>%
hoist(json,
lat = list("results", 1, "geometry", "location", "lat"),
lng = list("results", 1, "geometry", "location", "lng")
)
#> # A tibble: 5 x 4
#> city lat lng json
#> <chr> <dbl> <dbl> <list>
#> 1 Houston 29.8 -95.4 <named list [2]>
#> 2 LA 34.1 -118. <named list [2]>
#> 3 New York 40.7 -74.0 <named list [2]>
#> 4 Chicago 41.9 -87.6 <named list [2]>
#> 5 Springfield 37.2 -93.3 <named list [2]>
Sharla Gelfand-en diskografia
Azkenik, egitura konplexuena aztertuko dugu: Sharla Gelfand-en diskografia. Goiko adibideetan bezala, zerrenda zutabe bakarreko datu-marko batean bihurtzen hasten gara, eta gero hedatzen dugu osagai bakoitza zutabe bereizia izan dadin. Gainera, zutabea eraldatzen dut date_added R-n dagokion data eta ordu formatuan.
discs <- tibble(disc = discog) %>%
unnest_wider(disc) %>%
mutate(date_added = as.POSIXct(strptime(date_added, "%Y-%m-%dT%H:%M:%S")))
discs
#> # A tibble: 155 x 5
#> instance_id date_added basic_information id rating
#> <int> <dttm> <list> <int> <int>
#> 1 354823933 2019-02-16 17:48:59 <named list [11]> 7496378 0
#> 2 354092601 2019-02-13 14:13:11 <named list [11]> 4490852 0
#> 3 354091476 2019-02-13 14:07:23 <named list [11]> 9827276 0
#> 4 351244906 2019-02-02 11:39:58 <named list [11]> 9769203 0
#> 5 351244801 2019-02-02 11:39:37 <named list [11]> 7237138 0
#> 6 351052065 2019-02-01 20:40:53 <named list [11]> 13117042 0
#> 7 350315345 2019-01-29 15:48:37 <named list [11]> 7113575 0
#> 8 350315103 2019-01-29 15:47:22 <named list [11]> 10540713 0
#> 9 350314507 2019-01-29 15:44:08 <named list [11]> 11260950 0
#> 10 350314047 2019-01-29 15:41:35 <named list [11]> 11726853 0
#> # … with 145 more rows
Maila honetan, disko bakoitza Sharlaren diskografian noiz gehitu den informazioa jasotzen dugu, baina ez dugu disko horiei buruzko daturik ikusten. Horretarako zutabea zabaldu behar dugu basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Zoritxarrez, errore bat jasoko dugu, zeren... zerrendaren barruan basic_information izen bereko zutabe bat dago basic_information. Akats bat gertatzen bada, bere kausa azkar zehazteko, erabil dezakezu names_repair = "unique":
Ondoren, jatorrizko datu-multzora itzul ditzakezu behar bezala.
Ondorioa
Liburutegiaren muinera tidyverse Datuak prozesatzeko filosofia komun batek batutako pakete erabilgarriak biltzen ditu.
Artikulu honetan funtzioen familia aztertu dugu unnest_*(), habiaratutako zerrendetatik elementuak ateratzeko lan egitera zuzenduta. Pakete honek kontzeptuaren arabera datuak bihurtzea errazten duten beste ezaugarri erabilgarriak ditu Datu txukunak.