ProHoster > Blog > Pentadbiran > Mengembangkan lajur bersarang - senarai menggunakan bahasa R (pakej kemas dan fungsi keluarga yang tidak bersarang)
Mengembangkan lajur bersarang - senarai menggunakan bahasa R (pakej kemas dan fungsi keluarga yang tidak bersarang)
Dalam kebanyakan kes, apabila bekerja dengan respons yang diterima daripada API, atau dengan mana-mana data lain yang mempunyai struktur pepohon yang kompleks, anda berhadapan dengan format JSON dan XML.
Format ini mempunyai banyak kelebihan: ia menyimpan data dengan agak padat dan membolehkan anda mengelakkan pertindihan maklumat yang tidak perlu.
Kelemahan format ini ialah kerumitan pemprosesan dan analisisnya. Data tidak berstruktur tidak boleh digunakan dalam pengiraan dan visualisasi tidak boleh dibina di atasnya.
Artikel ini adalah kesinambungan logik penerbitan "R package tidyr dan fungsi baharunya pivot_longer and pivot_wider". Ia akan membantu anda membawa struktur data tidak berstruktur ke dalam bentuk jadual yang biasa dan sesuai untuk analisis menggunakan pakej tidyr, termasuk dalam teras perpustakaan tidyverse, dan keluarga fungsinya unnest_*().
Содержание
Jika anda berminat dengan analisis data, anda mungkin berminat dengan saya telegram и youtube saluran. Kebanyakan kandungan didedikasikan untuk bahasa R.
segi empat tepat(nota penterjemah, saya tidak menemui pilihan terjemahan yang mencukupi untuk istilah ini, jadi kami biarkan sahaja.) ialah proses membawa data tidak berstruktur dengan tatasusunan bersarang ke dalam jadual dua dimensi yang terdiri daripada baris dan lajur biasa. DALAM tidyr Terdapat beberapa fungsi yang akan membantu anda mengembangkan lajur senarai bersarang dan mengurangkan data kepada bentuk jadual segi empat tepat:
unnest_longer() mengambil setiap elemen senarai lajur dan mencipta baris baharu.
unnest_wider() mengambil setiap elemen senarai lajur dan mencipta lajur baharu.
unnest_auto() secara automatik menentukan fungsi mana yang terbaik untuk digunakan unnest_longer() atau unnest_wider().
hoist() sama seperti unnest_wider() tetapi hanya memilih komponen yang ditentukan dan membolehkan anda bekerja dengan beberapa tahap sarang.
Kebanyakan masalah yang berkaitan dengan membawa data tidak berstruktur dengan beberapa peringkat sarang ke dalam jadual dua dimensi boleh diselesaikan dengan menggabungkan fungsi yang disenaraikan dengan dplyr.
Untuk menunjukkan teknik ini, kami akan menggunakan pakej repurrrsive, yang menyediakan berbilang senarai kompleks berbilang peringkat yang diperoleh daripada API web.
Mari mulakan dengan gh_users, senarai yang mengandungi maklumat tentang enam pengguna GitHub. Mula-mula mari kita ubah senarai gh_users в mencebik bingkai:
users <- tibble( user = gh_users )
Ini nampaknya agak berlawanan dengan intuisi: mengapa menyediakan senarai gh_users, kepada struktur data yang lebih kompleks? Tetapi bingkai data mempunyai kelebihan besar: ia menggabungkan berbilang vektor supaya semuanya dijejaki dalam satu objek.
Setiap elemen objek users ialah senarai bernama di mana setiap elemen mewakili lajur.
Dalam kes ini, kami mempunyai jadual yang terdiri daripada 30 lajur, dan kami tidak memerlukan kebanyakannya, jadi kami boleh unnest_wider() gunakan hoist(). hoist() membolehkan kami mengekstrak komponen terpilih 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() mengalih keluar komponen bernama yang ditentukan daripada senarai lajur penggunajadi anda boleh pertimbangkan hoist() seperti memindahkan komponen daripada senarai dalaman bingkai tarikh ke peringkat teratasnya.
Repositori Github
Penjajaran senarai gh_repos kita mulakan sama dengan menukarnya kepada tibble:
Kali ini unsur-unsur pengguna mewakili senarai repositori yang dimiliki oleh pengguna ini. Setiap repositori adalah pemerhatian yang berasingan, jadi mengikut konsep data yang kemas (lebih kurang data kemas) ia sepatutnya menjadi barisan baharu, itulah sebabnya kami menggunakan 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 boleh gunakan unnest_wider() atau 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 membolehkan kami mendapatkan nilai tahap kedua daripada senarai bersarang owner. Pendekatan alternatif adalah untuk mendapatkan keseluruhan senarai owner dan kemudian menggunakan fungsi tersebut unnest_wider() letakkan setiap elemennya ke dalam lajur:
Daripada berfikir tentang memilih fungsi yang betul unnest_longer() atau unnest_wider() anda boleh gunakan unnest_auto(). Fungsi ini menggunakan beberapa kaedah heuristik untuk memilih fungsi yang paling sesuai untuk mengubah data, dan memaparkan mesej tentang kaedah yang dipilih.
got_chars mempunyai struktur yang sama dengan gh_users: Ini ialah satu set senarai bernama, di mana setiap elemen senarai dalaman menerangkan beberapa atribut watak Game of Thrones. Membawa got_chars Untuk paparan jadual, kita mulakan dengan mencipta bingkai tarikh, sama seperti dalam contoh sebelumnya, dan kemudian menukar setiap elemen ke dalam lajur yang berasingan:
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 sukar daripada gh_users, kerana beberapa komponen senarai char sendiri adalah senarai, akibatnya kita mendapat tiang - senarai:
Tindakan selanjutnya anda bergantung pada matlamat analisis. Mungkin anda perlu meletakkan maklumat pada baris untuk setiap buku dan siri di mana watak itu 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 jadual yang membolehkan anda memadankan watak dan kerja:
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 kosong "" di ladang title, ini disebabkan oleh ralat yang dibuat semasa memasukkan data ke dalam got_chars: sebenarnya, watak yang tiada tajuk buku dan siri TV yang sepadan dalam bidang title mesti mempunyai vektor panjang 0, bukan vektor panjang 1 yang mengandungi rentetan kosong.)
Kita boleh menulis semula contoh di atas menggunakan fungsi unnest_auto(). Pendekatan ini mudah untuk analisis sekali sahaja, tetapi anda tidak boleh bergantung pada unnest_auto() untuk digunakan secara berkala. Intinya ialah jika struktur data anda berubah unnest_auto() boleh menukar mekanisme transformasi data yang dipilih jika ia mula mengembangkan lajur senarai ke dalam baris menggunakan unnest_longer(), maka apabila struktur data masuk berubah, logik boleh diubah memihak unnest_wider(), dan menggunakan pendekatan ini secara berterusan boleh membawa kepada ralat yang tidak dijangka.
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
Pengekodan geo dengan Google
Seterusnya, kita akan melihat struktur data yang lebih kompleks yang diperoleh daripada perkhidmatan geokod Google. Bukti kelayakan caching adalah bertentangan dengan peraturan bekerja dengan API peta Google, jadi saya akan mula-mula menulis pembalut mudah di sekeliling API. Yang berdasarkan penyimpanan kunci API Peta Google dalam pembolehubah persekitaran; Jika anda tidak mempunyai kunci untuk bekerja dengan API Peta Google yang disimpan dalam pembolehubah persekitaran anda, serpihan kod yang dibentangkan dalam bahagian ini tidak akan dilaksanakan.
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)
}
Nasib baik, kami boleh menyelesaikan masalah menukar data ini ke dalam bentuk jadual langkah demi langkah menggunakan fungsi tidyr. Untuk menjadikan tugasan itu lebih mencabar dan realistik, saya akan mulakan dengan pengekodan geo beberapa bandar:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Saya akan menukar hasil yang terhasil menjadi tibble, untuk kemudahan, saya akan menambah lajur dengan nama bandar yang sepadan.
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]>
Tahap pertama mengandungi komponen status и result, yang boleh 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
Sila ambil perhatian bahawa results ialah senarai pelbagai peringkat. Kebanyakan bandar mempunyai 1 elemen (mewakili nilai unik yang sepadan dengan geocoding API), tetapi Springfield mempunyai dua elemen. Kita boleh menarik mereka ke dalam baris yang berasingan 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
Kini mereka semua mempunyai komponen yang sama, yang boleh disahkan 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 boleh mencari koordinat latitud dan longitud bagi setiap bandar dengan mengembangkan senarai 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 anda perlu kembangkan 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>
Sekali lagi, unnest_auto() memudahkan operasi yang diterangkan dengan beberapa risiko yang mungkin disebabkan oleh perubahan struktur data 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 boleh melihat alamat pertama untuk setiap bandar:
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 menyelam pelbagai peringkat untuk pergi terus ke 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
Akhirnya, kita akan melihat struktur yang paling kompleks - diskografi Sharla Gelfand. Seperti dalam contoh di atas, kita mulakan dengan menukar senarai kepada bingkai data lajur tunggal, dan kemudian melanjutkannya supaya setiap komponen adalah lajur yang berasingan. Juga saya mengubah lajur date_added kepada format tarikh dan masa yang sesuai dalam 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 tahap ini, kami mendapat maklumat tentang bila setiap cakera telah ditambahkan pada diskografi Sharla, tetapi kami tidak melihat sebarang data tentang cakera tersebut. Untuk melakukan ini, kita perlu mengembangkan lajur basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Malangnya, kami akan menerima ralat, kerana... dalam senarai basic_information terdapat lajur dengan nama yang sama basic_information. Jika ralat sedemikian berlaku, untuk menentukan dengan cepat puncanya, anda boleh menggunakan names_repair = "unique":
Anda kemudian boleh menyertai mereka kembali ke set data asal seperti yang diperlukan.
Kesimpulan
Ke teras perpustakaan tidyverse termasuk banyak pakej berguna yang disatukan oleh falsafah pemprosesan data biasa.
Dalam artikel ini kami mengkaji keluarga fungsi unnest_*(), yang bertujuan untuk bekerja dengan mengekstrak elemen daripada senarai bersarang. Pakej ini mengandungi banyak lagi ciri berguna yang memudahkan untuk menukar data mengikut konsep Data Kemas.