ProHoster > Blog > Administrasyon an > Elaji kolòn enbrike - lis lè l sèvi avèk lang R (pake tidyr ak fonksyon nan fanmi an unnest)
Elaji kolòn enbrike - lis lè l sèvi avèk lang R (pake tidyr ak fonksyon nan fanmi an unnest)
Nan pifò ka yo, lè w ap travay ak yon repons ou resevwa nan men yon API, oswa ak nenpòt lòt done ki gen yon estrikti pyebwa konplèks, w ap fè fas ak fòma JSON ak XML.
Fòma sa yo gen anpil avantaj: yo estoke done byen konpak epi pèmèt ou evite kopi enfòmasyon nesesè.
Dezavantaj nan fòma sa yo se konpleksite nan pwosesis yo ak analiz. Done san estrikti pa ka itilize nan kalkil ak vizyalizasyon pa ka bati sou li.
Atik sa a se yon kontinyasyon lojik nan piblikasyon an "R package tidyr ak nouvo fonksyon li yo pivot_longer ak pivot_wider". Li pral ede w pote estrikti done san estrikti nan yon fòm abitye ak apwopriye pou analiz tabular lè l sèvi avèk pake a tidyr, enkli nan nwayo bibliyotèk la tidyverse, ak fanmi li nan fonksyon unnest_*().
Content
Si w enterese nan analiz done, ou ta ka enterese nan mwen an telegram и YouTube chanèl. Pifò nan kontni an dedye a lang R la.
Rectangling(Nòt tradiktè a, mwen pa t jwenn bon jan opsyon tradiksyon pou tèm sa a, kidonk nou pral kite li jan li ye.) se pwosesis pou pote done ki pa estriktire ak etalaj enbrike nan yon tablo ki genyen de dimansyon ki gen ranje ak kolòn abitye. NAN tidyr Gen plizyè fonksyon ki pral ede w elaji kolòn lis enbrike yo epi redwi done yo nan yon fòm rektangilè, tabular:
unnest_longer() pran chak eleman nan lis kolòn ak kreye yon nouvo ranje.
unnest_wider() pran chak eleman nan lis kolòn ak kreye yon nouvo kolòn.
unnest_auto() otomatikman detèmine ki fonksyon ki pi bon pou itilize unnest_longer() oswa unnest_wider().
hoist() menm jan ak unnest_wider() men chwazi sèlman konpozan yo espesifye epi li pèmèt ou travay ak plizyè nivo nidifikasyon.
Pifò nan pwoblèm ki asosye ak pote done ki pa estriktire ak plizyè nivo nidifikasyon nan yon tablo ki genyen de dimansyon yo ka rezoud lè w konbine fonksyon ki nan lis yo ak dplyr.
Pou demontre teknik sa yo, nou pral sèvi ak pake a repurrrsive, ki bay plizyè lis konplèks, milti-nivo ki sòti nan yon API entènèt.
Ann kòmanse avèk yo gh_itilizatè yo, yon lis ki gen enfòmasyon sou sis itilizatè GitHub. Premye ann transfòme lis la gh_itilizatè yo в tible ankadreman:
users <- tibble( user = gh_users )
Sa a sanble yon ti kras counterintuitive: poukisa bay yon lis gh_itilizatè yo, nan yon estrikti done ki pi konplèks? Men, yon ankadreman done gen yon gwo avantaj: li konbine plizyè vektè pou tout bagay yo swiv nan yon sèl objè.
Chak eleman objè users se yon lis non kote chak eleman reprezante yon kolòn.
Nan ka sa a, nou gen yon tab ki gen 30 kolòn, epi nou pa pral bezwen pi fò nan yo, pou nou ka pito. unnest_wider() itilize hoist(). hoist() pèmèt nou ekstrè eleman chwazi lè l sèvi avèk sentaks la menm jan ak 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() retire eleman ki espesifye yo nan yon lis kolòn itilizatèkonsa ou ka konsidere hoist() tankou deplase eleman soti nan lis la entèn nan yon ankadreman dat nan nivo siperyè li yo.
Repozitwa Github
Lis aliyman gh_repos nou kòmanse menm jan an pa konvèti li nan tibble:
Fwa sa a eleman yo itilizatè reprezante yon lis depo itilizatè sa a posede. Chak depo se yon obsèvasyon separe, kidonk dapre konsèp nan done pwòp (apeprè done pwòp) yo ta dwe vin nouvo liy, se poutèt sa nou itilize unnest_longer() epi yo pa 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
Koulye a, nou ka itilize unnest_wider() oswa 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
Peye atansyon sou itilizasyon an c("owner", "login"): Sa a pèmèt nou jwenn valè nan dezyèm nivo nan yon lis enbrike owner. Yon apwòch altènatif se jwenn lis la tout antye owner ak Lè sa a, sèvi ak fonksyon an unnest_wider() mete chak nan eleman li yo nan yon kolòn:
Olye pou yo panse sou chwazi fonksyon an dwa unnest_longer() oswa unnest_wider() ou ka itilize unnest_auto(). Fonksyon sa a sèvi ak plizyè metòd euristik pou chwazi fonksyon ki pi apwopriye pou transfòme done yo, epi li montre yon mesaj sou metòd yo chwazi a.
got_chars gen yon estrikti ki idantik ak gh_users: Sa a se yon seri lis non, kote chak eleman nan lis enteryè a dekri kèk atribi nan yon karaktè Game of Thrones. Pote got_chars Pou gade tab la, nou kòmanse pa kreye yon ankadreman dat, jis tankou nan egzanp anvan yo, ak Lè sa a, konvèti chak eleman nan yon kolòn separe:
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>
Estrikti got_chars yon ti jan pi difisil pase gh_users, paske kèk eleman lis char tèt yo se yon lis, kòm yon rezilta nou jwenn poto - lis:
Plis aksyon ou depann de objektif analiz la. Petèt ou bezwen mete enfòmasyon sou liy yo pou chak liv ak seri kote karaktè a parèt:
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
Oswa petèt ou vle kreye yon tab ki pèmèt ou matche ak karaktè a ak travay la:
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
(Remake valè vid yo "" nan jaden title, sa a se akòz erè ki fèt lè w ap antre done nan got_chars: an reyalite, karaktè pou ki pa gen okenn liv ki koresponn ak tit seri televizyon nan jaden an title dwe gen yon vektè longè 0, pa yon vektè longè 1 ki genyen fisèl vid la.)
Nou ka reekri egzanp ki anwo a lè l sèvi avèk fonksyon an unnest_auto(). Apwòch sa a se pratik pou analiz yon sèl fwa, men ou pa ta dwe konte sou unnest_auto() pou itilize sou yon baz regilye. Pwen an se ke si estrikti done ou chanje unnest_auto() ka chanje mekanis transfòmasyon done chwazi a si li okòmansman elaji kolòn lis nan ranje lè l sèvi avèk unnest_longer(), Lè sa a, lè estrikti nan done yo fèk ap rantre chanje, lojik la ka chanje an favè unnest_wider(), epi lè l sèvi avèk apwòch sa a sou yon baz kontinyèl ka mennen nan erè inatandi.
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 ak Google
Apre sa, nou pral gade nan yon estrikti ki pi konplèks nan done yo jwenn nan sèvis jeokodaj Google la. Kache kalifikasyon yo kont règ yo nan travay ak Google Maps API a, kidonk mwen pral premye ekri yon anbalaj senp alantou API a. Ki baze sou estoke kle API Google Maps nan yon varyab anviwònman; Si ou pa gen kle pou travay ak Google Maps API ki estoke nan varyab anviwònman ou yo, fragman kòd yo prezante nan seksyon sa a p ap egzekite.
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)
}
Erezman, nou ka rezoud pwoblèm nan konvèti done sa yo nan yon fòm tabular etap pa etap lè l sèvi avèk fonksyon tidyr. Pou fè travay la yon ti kras pi difisil ak reyalis, mwen pral kòmanse pa jeokodaj kèk vil:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Mwen pral konvèti rezilta a nan tibble, pou konvenyans, mwen pral ajoute yon kolòn ak non vil ki koresponn lan.
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]>
Premye nivo a gen eleman status и result, ki nou ka elaji ak 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
sonje ke results se yon lis milti-nivo. Pifò vil yo gen 1 eleman (ki reprezante yon valè inik ki koresponn ak API jeokodaj la), men Springfield gen de. Nou ka rale yo nan liy separe ak 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
Koulye a, yo tout gen menm eleman yo, ki ka verifye lè l sèvi avèk 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
Nou ka jwenn kowòdone latitid ak lonjitid chak vil lè nou agrandi lis la 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>
Lè sa a, kote a pou ki ou bezwen elaji 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>
Ankò, unnest_auto() senplifye operasyon ki dekri a ak kèk risk ki ka koze pa chanje estrikti a nan done yo fèk ap rantre:
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>
Nou ka jis gade tou nan premye adrès la pou chak vil:
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>
Oswa itilize hoist() pou yon plonje milti-nivo ale dirèkteman nan 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
Finalman, nou pral gade estrikti ki pi konplèks la - diskografi Sharla Gelfand. Kòm nan egzanp ki anwo yo, nou kòmanse konvèti lis la nan yon ankadreman done yon sèl kolòn, ak Lè sa a, pwolonje li pou ke chak eleman se yon kolòn separe. Epitou mwen transfòme kolòn nan date_added nan fòma dat ak lè apwopriye nan 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
Nan nivo sa a, nou jwenn enfòmasyon sou lè yo te ajoute chak disk nan diskografi Sharla a, men nou pa wè okenn done sou disk sa yo. Pou fè sa nou bezwen elaji kolòn nan basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Malerezman, nou pral resevwa yon erè, paske... andedan lis la basic_information gen yon kolòn ki gen menm non basic_information. Si yon erè konsa rive, yo nan lòd yo byen vit detèmine kòz li yo, ou ka itilize names_repair = "unique":
Lè sa a, ou ka rantre yo tounen nan dataset orijinal la jan sa nesesè.
Konklizyon
Nan nwayo bibliyotèk la tidyverse gen ladann anpil pakè itil ini pa yon filozofi pwosesis done komen.
Nan atik sa a nou egzamine fanmi an nan fonksyon unnest_*(), ki vize a travay ak èkstraksyon eleman nan lis enbrike. Pake sa a gen anpil lòt karakteristik itil ki fè li pi fasil konvèti done dapre konsèp la Done pwòp.