ProHoster > blog > administrasi > Memperluas kolom bersarang - daftar menggunakan bahasa R (paket rapi dan fungsi keluarga yang tidak bersarang)
Memperluas kolom bersarang - daftar menggunakan bahasa R (paket rapi dan fungsi keluarga yang tidak bersarang)
Dalam kebanyakan kasus, saat bekerja dengan respons yang diterima dari API, atau dengan data lain yang memiliki struktur pohon kompleks, Anda dihadapkan pada format JSON dan XML.
Format ini memiliki banyak keunggulan: format ini menyimpan data dengan cukup kompak dan menghindari duplikasi informasi yang tidak perlu.
Kerugian dari format ini adalah kompleksitas pemrosesan dan analisisnya. Data tidak terstruktur tidak dapat digunakan dalam penghitungan dan visualisasi tidak dapat dibangun berdasarkan data tersebut.
Artikel ini merupakan kelanjutan logis dari publikasi "Paket R rapir dan fungsi barunya pivot_longer dan pivot_wider". Ini akan membantu Anda membawa struktur data tidak terstruktur ke dalam bentuk tabel yang familier dan cocok untuk analisis menggunakan paket tidyr, termasuk dalam inti perpustakaan tidyverse, dan kelompok fungsinya unnest_*().
kadar
Jika Anda tertarik dengan analisis data, Anda mungkin tertarik dengan saya Telegram и Youtube saluran. Sebagian besar konten didedikasikan untuk bahasa R.
persegi panjang(Catatan penerjemah, saya tidak menemukan opsi terjemahan yang memadai untuk istilah ini, jadi biarkan saja.) adalah proses membawa data tidak terstruktur dengan array bersarang ke dalam tabel dua dimensi yang terdiri dari baris dan kolom yang sudah dikenal. DI DALAM tidyr Ada beberapa fungsi yang akan membantu Anda memperluas kolom daftar bersarang dan mengurangi data menjadi bentuk tabel persegi panjang:
unnest_longer() mengambil setiap elemen daftar kolom dan membuat baris baru.
unnest_wider() mengambil setiap elemen daftar kolom dan membuat kolom baru.
unnest_auto() secara otomatis menentukan fungsi mana yang terbaik untuk digunakan unnest_longer() или unnest_wider().
hoist() mirip dengan unnest_wider() tetapi hanya memilih komponen tertentu dan memungkinkan Anda bekerja dengan beberapa level sarang.
Sebagian besar masalah yang terkait dengan membawa data tidak terstruktur dengan beberapa tingkat bersarang ke dalam tabel dua dimensi dapat diselesaikan dengan menggabungkan fungsi-fungsi yang terdaftar dengan dplyr.
Untuk mendemonstrasikan teknik ini, kami akan menggunakan paket tersebut repurrrsive, yang menyediakan beberapa daftar multi-level kompleks yang berasal dari API web.
Mari kita mulai gh_users, daftar yang berisi informasi tentang enam pengguna GitHub. Pertama mari kita ubah daftarnya gh_users в tibble bingkai:
users <- tibble( user = gh_users )
Hal ini tampaknya sedikit berlawanan dengan intuisi: mengapa memberikan daftar gh_users, ke struktur data yang lebih kompleks? Namun bingkai data memiliki keuntungan besar: ia menggabungkan beberapa vektor sehingga semuanya terlacak dalam satu objek.
Setiap elemen objek users adalah daftar bernama di mana setiap elemen mewakili kolom.
Dalam hal ini, kita memiliki tabel yang terdiri dari 30 kolom, dan kita tidak memerlukan sebagian besar kolom, jadi kita bisa unnest_wider() untuk menggunakan hoist(). hoist() memungkinkan kita mengekstrak komponen yang dipilih menggunakan sintaks yang sama seperti 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() menghapus komponen bernama tertentu dari daftar kolom pemakaijadi kamu bisa mempertimbangkannya hoist() seperti memindahkan komponen dari daftar internal kerangka tanggal ke tingkat teratasnya.
Repositori Github
Penyelarasan daftar gh_repos kita memulai hal yang sama dengan mengubahnya menjadi tibble:
Kali ini elemennya pemakai mewakili daftar repositori yang dimiliki oleh pengguna ini. Masing-masing repositori merupakan observasi tersendiri, sehingga sesuai konsep datanya rapi (kira-kira data rapi) mereka harus menjadi jalur baru, itulah sebabnya kami menggunakannya unnest_longer() tidak 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
Sekarang kita bisa menggunakan unnest_wider() или 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
Perhatikan penggunaannya c("owner", "login"): Ini memungkinkan kita mendapatkan nilai tingkat kedua dari daftar bersarang owner. Pendekatan alternatif adalah mendapatkan seluruh daftar owner dan kemudian menggunakan fungsinya unnest_wider() masukkan setiap elemennya ke dalam kolom:
Daripada memikirkan memilih fungsi yang tepat unnest_longer() или unnest_wider() Kamu dapat memakai unnest_auto(). Fungsi ini menggunakan beberapa metode heuristik untuk memilih fungsi yang paling sesuai untuk mentransformasikan data, dan menampilkan pesan tentang metode yang dipilih.
got_chars memiliki struktur yang identik dengan gh_users: Ini adalah sekumpulan daftar bernama, di mana setiap elemen daftar bagian dalam mendeskripsikan beberapa atribut karakter Game of Thrones. Membawa got_chars Untuk tampilan tabel, kita mulai dengan membuat bingkai tanggal, seperti pada contoh sebelumnya, lalu mengonversi setiap elemen menjadi kolom terpisah:
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 agak lebih sulit daripada gh_users, Karena beberapa komponen daftar char sendiri adalah daftar, alhasil kita mendapatkan pilar – daftar :
Tindakan Anda selanjutnya bergantung pada tujuan analisis. Mungkin Anda perlu memasukkan informasi pada baris setiap buku dan seri di mana karakter tersebut muncul:
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
Atau mungkin Anda ingin membuat tabel yang memungkinkan Anda mencocokkan karakter dan karya:
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
(Perhatikan nilai yang kosong "" di lapangan title, hal ini disebabkan kesalahan yang dilakukan pada saat memasukkan data ke dalam got_chars: sebenarnya, karakter yang tidak memiliki judul buku dan serial TV yang sesuai di bidangnya title harus mempunyai vektor dengan panjang 0, bukan vektor dengan panjang 1 yang memuat string kosong.)
Kita dapat menulis ulang contoh di atas menggunakan fungsi tersebut unnest_auto(). Pendekatan ini cocok untuk analisis satu kali, tetapi Anda tidak boleh mengandalkannya unnest_auto() untuk digunakan secara rutin. Maksudnya adalah jika struktur data anda berubah unnest_auto() dapat mengubah mekanisme transformasi data yang dipilih jika awalnya memperluas kolom daftar menjadi baris menggunakan unnest_longer(), maka ketika struktur data yang masuk berubah, logikanya dapat diubah sesuai keinginan unnest_wider(), dan menggunakan pendekatan ini secara terus-menerus dapat menyebabkan kesalahan yang tidak terduga.
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
Geokode dengan Google
Selanjutnya, kita akan melihat struktur data yang lebih kompleks yang diperoleh dari layanan geocoding Google. Kredensial cache melanggar aturan bekerja dengan Google Maps API, jadi pertama-tama saya akan menulis pembungkus sederhana di sekitar API. Yang didasarkan pada penyimpanan kunci Google Maps API dalam variabel lingkungan; Jika Anda tidak memiliki kunci untuk bekerja dengan Google Maps API yang tersimpan di variabel lingkungan Anda, potongan kode yang disajikan di bagian ini tidak akan 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)
}
Untungnya, kita dapat menyelesaikan masalah mengubah data ini menjadi bentuk tabel selangkah demi selangkah menggunakan fungsi tidyr. Untuk membuat tugas ini sedikit lebih menantang dan realistis, saya akan mulai dengan melakukan geocoding pada beberapa kota:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Saya akan mengubah hasil yang dihasilkan menjadi tibble, untuk kenyamanan saya akan menambahkan kolom dengan nama kota yang sesuai.
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 pertama berisi komponen status и result, yang dapat kami kembangkan 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
Harap dicatat bahwa results adalah daftar bertingkat. Sebagian besar kota memiliki 1 elemen (mewakili nilai unik yang sesuai dengan API geocoding), namun Springfield memiliki dua elemen. Kita dapat menariknya ke dalam baris terpisah dengan 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
Sekarang semuanya memiliki komponen yang sama, yang dapat diverifikasi menggunakan 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 dapat mengetahui koordinat lintang dan bujur setiap kota dengan memperluas daftarnya 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>
Dan kemudian lokasi yang perlu Anda perluas 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>
Lagi, unnest_auto() menyederhanakan operasi yang dijelaskan dengan beberapa risiko yang mungkin disebabkan oleh perubahan struktur data yang masuk:
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 juga bisa melihat alamat pertama setiap kota:
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>
Atau gunakan hoist() untuk penyelaman multi-level untuk langsung menuju 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
Terakhir, kita akan melihat struktur yang paling rumit - diskografi Sharla Gelfand. Seperti pada contoh di atas, kita mulai dengan mengonversi daftar menjadi bingkai data satu kolom, lalu memperluasnya sehingga setiap komponen menjadi kolom terpisah. Saya juga mengubah kolom date_added ke format tanggal dan waktu yang sesuai di 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
Pada tingkat ini, kami mendapatkan informasi tentang kapan setiap disk ditambahkan ke diskografi Sharla, tetapi kami tidak melihat data apa pun tentang disk tersebut. Untuk melakukan hal ini kita perlu memperluas kolom basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Sayangnya, kami akan menerima kesalahan, karena... di dalam daftar basic_information ada kolom dengan nama yang sama basic_information. Jika kesalahan seperti itu terjadi, Anda dapat menggunakan names_repair = "unique":
Anda kemudian dapat menggabungkannya kembali ke kumpulan data asli sesuai kebutuhan.
Kesimpulan
Ke inti perpustakaan tidyverse mencakup banyak paket berguna yang disatukan oleh filosofi pemrosesan data yang sama.
Pada artikel ini kami memeriksa rangkaian fungsi unnest_*(), yang ditujukan untuk bekerja dengan mengekstraksi elemen dari daftar bersarang. Paket ini berisi banyak fitur berguna lainnya yang memudahkan konversi data sesuai konsep Data Rapi.