ProHoster > Блог > Administrasi > Ngembangake kolom bersarang - dhaptar nggunakake basa R (paket rapi lan fungsi saka kulawarga unnest)
Ngembangake kolom bersarang - dhaptar nggunakake basa R (paket rapi lan fungsi saka kulawarga unnest)
Umume kasus, nalika nggarap respon sing ditampa saka API, utawa karo data liyane sing nduweni struktur wit sing rumit, sampeyan bakal ngadhepi format JSON lan XML.
Format kasebut duwe akeh kaluwihan: padha nyimpen data kanthi kompak lan ngidini sampeyan ngindhari duplikasi informasi sing ora perlu.
Kerugian saka format kasebut yaiku kerumitan pangolahan lan analisis. Data sing ora terstruktur ora bisa digunakake ing petungan lan visualisasi ora bisa dibangun.
Artikel iki minangka tutugan logis saka publikasi "R paket tidyr lan fungsi anyar pivot_longer lan pivot_wider". Iku bakal mbantu nggawa struktur data unstructured menyang menowo lan cocok kanggo analisis wangun tabular nggunakake paket tidyr, kalebu ing inti saka perpustakaan tidyverse, lan kulawarga fungsi unnest_*().
Isi
Yen sampeyan kasengsem ing analisis data, sampeyan bisa uga kasengsem ing sandi telegram и youtube saluran. Sebagéyan gedhé isiné dikhususaké kanggo basa R.
Persegi panjang(cathetan penerjemah, aku ora nemokake opsi terjemahan sing nyukupi kanggo istilah iki, mula kita bakal tetep wae.) yaiku proses nggawa data sing ora terstruktur kanthi susunan bersarang menyang tabel rong dimensi sing dumadi saka baris lan kolom sing akrab. ING tidyr Ana sawetara fungsi sing bakal mbantu sampeyan nggedhekake kolom dhaptar bersarang lan nyuda data menyang wangun persegi dowo, tabular:
unnest_longer() njupuk saben unsur saka dhaftar kolom lan nggawe baris anyar.
unnest_wider() njupuk saben unsur saka dhaftar kolom lan nggawe kolom anyar.
unnest_auto() kanthi otomatis nemtokake fungsi sing paling apik kanggo nggunakake unnest_longer() utawa unnest_wider().
hoist() padha karo unnest_wider() но отбирает только указанные компоненты и позволяет работать с несколькими уровнями вложенности.
Umume masalah sing digandhengake karo data sing ora kabentuk kanthi sawetara tingkat nesting menyang tabel rong dimensi bisa ditanggulangi kanthi nggabungake fungsi sing kadhaptar karo dplyr.
Kanggo nduduhake teknik kasebut, kita bakal nggunakake paket kasebut repurrrsive, sing nyedhiyakake macem-macem dhaptar kompleks, multi-level sing asale saka API web.
Miwiti gh_users, dhaptar sing ngemot informasi babagan enem pangguna GitHub. Pisanan ayo ngowahi dhaptar gh_users в tikel pigura:
users <- tibble( user = gh_users )
Iki misale jek rada counterintuitive: kok nyedhiyani dhaftar gh_users, menyang struktur data sing luwih rumit? Nanging pigura data duwe kauntungan gedhe: nggabungake pirang-pirang vektor supaya kabeh dilacak ing siji obyek.
Saben unsur obyek users представляет собой именованный список, в котором каждый элемент представляет столбец.
В этом случае мы получили таблицу состоящую из 30 столбцов, и большинство из них нам не понадобятся, поэтому мы можем вместо unnest_wider() nggunakake hoist(). hoist() ngidini kita ngekstrak komponen sing dipilih nggunakake sintaksis sing padha 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() mbusak komponen sing dijenengi saka dhaptar kolom usersupaya sampeyan bisa nimbang hoist() kaya obah komponen saka dhaftar internal pigura tanggal kanggo tingkat ndhuwur.
Repositori Github
Alignment dhaptar gh_repos kita miwiti padha dening Ngonversi menyang tibble:
Wektu iki unsur user makili dhaptar repositori sing diduweni dening pangguna iki. Saben repositori minangka pengamatan sing kapisah, mula miturut konsep data sing rapi (kira-kira. data rapi) они должны стать новыми строками, в связи с чем мы используем unnest_longer() nanging ora 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
Saiki kita bisa nggunakake unnest_wider() utawa 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
Pay manungsa waé kanggo panggunaan c("owner", "login"): Iki ngidini kita entuk nilai tingkat kapindho saka dhaptar nested owner. Альтернативный подход состоит в том, чтобы получить весь список owner и затем с помощью функции unnest_wider() sijine saben unsur ing kolom:
Tinimbang mikir babagan milih fungsi sing bener unnest_longer() utawa unnest_wider() sampeyan bisa nggunakake unnest_auto(). Fungsi iki nggunakake sawetara metode heuristik kanggo milih fungsi sing paling cocok kanggo ngowahi data, lan nampilake pesen babagan metode sing dipilih.
got_chars nduweni struktur sing padha karo gh_users: Iki minangka dhaptar dhaptar sing dijenengi, ing ngendi saben unsur ing dhaptar njero nggambarake sawetara atribut saka karakter Game of Thrones. nggawa got_chars Kanggo tampilan tabel, kita miwiti kanthi nggawe pigura tanggal, kaya ing conto sadurunge, banjur ngowahi saben unsur dadi kolom sing kapisah:
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>
struktur got_chars несколько сложнее, чем gh_users, amarga sawetara komponen dhaftar char dhewe minangka dhaptar, minangka asil kita entuk pilar - dhaptar:
Tumindak luwih sampeyan gumantung marang tujuan analisis. Mbok menawa sampeyan kudu menehi informasi babagan garis kanggo saben buku lan seri ing ngendi karakter kasebut katon:
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
Или, может быть, вы хотите создать таблицу, которая позволит вам сопоставить персонажа и произведение:
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
(Elinga nilai kosong "" ing lapangan title, iki amarga kesalahan nalika ngetik data got_chars: nyatane, karakter sing ora ana judul buku lan seri TV sing cocog ing lapangan title kudu duwe vektor dawa 0, dudu vektor dawa 1 sing ngemot string kosong.)
Kita bisa nulis ulang conto ing ndhuwur nggunakake fungsi kasebut unnest_auto(). Pendekatan iki trep kanggo analisis siji-wektu, nanging sampeyan ora kudu ngandelake unnest_auto() kanggo nggunakake kanthi rutin. Intine yaiku yen struktur data sampeyan ganti unnest_auto() bisa ngganti mekanisme transformasi data sing dipilih yen pisanan ditambahi dhaftar kolom menyang baris nggunakake unnest_longer(), banjur nalika struktur data mlebu owah-owahan, logika bisa diganti ing sih unnest_wider(), lan nggunakake pendekatan iki kanthi terus-terusan bisa nyebabake kesalahan sing ora dikarepake.
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
Geocoding karo Google
Sabanjure, kita bakal ndeleng struktur data sing luwih rumit sing dipikolehi saka layanan geocoding Google. Kredensial cache nglawan aturan nggarap Google maps API, mula aku bakal nulis bungkus prasaja ing API. Sing adhedhasar nyimpen kunci Google Maps API ing variabel lingkungan; Yen sampeyan ora duwe kunci kanggo nggarap Google Maps API sing disimpen ing variabel lingkungan sampeyan, fragmen kode sing ditampilake ing bagean iki ora bakal dieksekusi.
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)
}
Begjanipun, kita bisa ngatasi masalah ngowahi data iki menyang wangun tabular langkah dening langkah nggunakake fungsi tidyr. Kanggo nggawe tugas dadi luwih tantangan lan nyata, aku bakal miwiti kanthi geocoding sawetara kutha:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Полученный результат я преобразую в tibble, kanggo penak, aku bakal nambah kolom kanthi jeneng kutha sing cocog.
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]>
Tingkat pisanan ngemot komponen status и result, kang kita bisa nggedhekake karo 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
elinga yen results punika dhaftar multi-level. Umume kutha duwe 1 unsur (makili nilai unik sing cocog karo geocoding API), nanging Springfield duwe loro. Kita bisa narik menyang garis kapisah karo 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
Saiki kabeh duwe komponen sing padha, sing bisa diverifikasi nggunakake 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
Kita bisa nemokake koordinat garis lintang lan bujur saben kutha kanthi ngembangake dhaptar 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>
Lan banjur lokasi sing sampeyan kudu nggedhekake 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>
Opo maneh, unnest_auto() nyederhanakake operasi sing diterangake kanthi sawetara risiko sing bisa disebabake kanthi ngganti struktur data sing mlebu:
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>
Kita uga bisa ndeleng alamat pisanan kanggo saben kutha:
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>
Utawa nggunakake hoist() kanggo nyilem multi-tingkat langsung menyang 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]>
Diskografi Sharla Gelfand
Pungkasan, kita bakal ndeleng struktur sing paling rumit - diskografi Sharla Gelfand. Kaya ing conto ing ndhuwur, kita miwiti kanthi ngowahi dhaptar menyang pigura data siji-kolom, lan banjur ngluwihi supaya saben komponen minangka kolom sing kapisah. Aku uga ngowahi kolom date_added menyang format tanggal lan wektu sing cocog ing R.
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
На этом уровне мы получили информацию о том, когда каждый диск был добавлен в дискографию Шарлы, но при этом не видим никаких данных об этих дисках. Для этого нам нужно расширить столбец basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Sayange, kita bakal nampa kesalahan, amarga ... nang daftar basic_information ana kolom kanthi jeneng sing padha basic_information. Yen ana kesalahan kasebut, supaya bisa nemtokake sababe kanthi cepet, sampeyan bisa nggunakake names_repair = "unique":
Sampeyan banjur bisa gabung maneh menyang dataset asli yen perlu.
kesimpulan
Menyang inti perpustakaan tidyverse kalebu akeh paket migunani sing digabung karo filosofi pangolahan data umum.
Ing artikel iki kita nliti kulawarga fungsi unnest_*(), sing ditujokake kanggo ngekstrak unsur saka dhaptar bersarang. Paket iki ngemot akeh fitur migunani liyane sing nggawe luwih gampang kanggo ngowahi data miturut konsep Data sing rapi.