ProHoster > blog > Gweinyddiaeth > Ehangu colofnau nythu - rhestrau sy'n defnyddio'r iaith R (pecyn taclus a swyddogaethau'r teulu unnest)
Ehangu colofnau nythu - rhestrau sy'n defnyddio'r iaith R (pecyn taclus a swyddogaethau'r teulu unnest)
Yn y rhan fwyaf o achosion, wrth weithio gydag ymateb a dderbyniwyd gan API, neu gydag unrhyw ddata arall sydd â strwythur coeden gymhleth, rydych chi'n wynebu fformatau JSON a XML.
Mae gan y fformatau hyn lawer o fanteision: maent yn storio data yn eithaf cryno ac yn eich galluogi i osgoi dyblygu gwybodaeth yn ddiangen.
Anfantais y fformatau hyn yw cymhlethdod eu prosesu a'u dadansoddi. Ni ellir defnyddio data anstrwythuredig mewn cyfrifiadau ac ni ellir adeiladu delweddu arno.
Mae'r erthygl hon yn barhad rhesymegol o'r cyhoeddiad "R pecyn taclus a'i swyddogaethau newydd pivot_longer a pivot_wider". Bydd yn eich helpu i ddod â strwythurau data anstrwythuredig i ffurf dabl gyfarwydd ac addas i'w dadansoddi gan ddefnyddio'r pecyn tidyr, wedi'i gynnwys yng nghraidd y llyfrgell tidyverse, a'i deulu o swyddogaethau unnest_*().
Cynnwys
Os oes gennych ddiddordeb mewn dadansoddi data, efallai y bydd gennych ddiddordeb yn fy telegram и youtube sianeli. Mae'r rhan fwyaf o'r cynnwys wedi'i neilltuo i'r iaith R.
Petryal(nodyn y cyfieithydd, ni wnes i ddod o hyd i opsiynau cyfieithu digonol ar gyfer y tymor hwn, felly byddwn yn ei adael fel y mae.) yw'r broses o ddod â data anstrwythuredig gydag araeau nythu i mewn i dabl dau ddimensiwn sy'n cynnwys rhesi a cholofnau cyfarwydd. YN tidyr Mae yna sawl swyddogaeth a fydd yn eich helpu i ehangu colofnau rhestr nythu a lleihau'r data i ffurf hirsgwar, tabl:
unnest_longer() yn cymryd pob elfen o'r rhestr colofnau ac yn creu rhes newydd.
unnest_wider() yn cymryd pob elfen o'r rhestr colofnau ac yn creu colofn newydd.
unnest_auto() yn penderfynu yn awtomatig pa swyddogaeth sydd orau i'w defnyddio unnest_longer() neu unnest_wider().
hoist() yn debyg i unnest_wider() ond yn dewis y cydrannau penodedig yn unig ac yn caniatáu ichi weithio gyda sawl lefel o nythu.
Gellir datrys y rhan fwyaf o'r problemau sy'n gysylltiedig â dod â data anstrwythuredig â sawl lefel o nythu i mewn i dabl dau ddimensiwn trwy gyfuno'r swyddogaethau rhestredig â dplyr.
I ddangos y technegau hyn, byddwn yn defnyddio'r pecyn repurrrsive, sy'n darparu rhestrau lluosog cymhleth, aml-lefel sy'n deillio o API gwe.
Gadewch i ni ddechrau gh_defnyddwyr, rhestr sy'n cynnwys gwybodaeth am chwe defnyddiwr GitHub. Yn gyntaf, gadewch i ni drawsnewid y rhestr gh_defnyddwyr в tibl ffrâm:
users <- tibble( user = gh_users )
Mae hyn yn ymddangos ychydig yn wrthreddfol: pam darparu rhestr gh_defnyddwyr, i strwythur data mwy cymhleth? Ond mae gan ffrâm ddata fantais fawr: mae'n cyfuno fectorau lluosog fel bod popeth yn cael ei olrhain mewn un gwrthrych.
Pob elfen gwrthrych users yn rhestr a enwir lle mae pob elfen yn cynrychioli colofn.
Yn yr achos hwn, mae gennym dabl sy'n cynnwys 30 colofn, ac ni fydd angen y rhan fwyaf ohonynt, felly gallwn ni yn lle hynny. unnest_wider() defnyddiwch hoist(). hoist() yn ein galluogi i echdynnu cydrannau dethol gan ddefnyddio'r un gystrawen â 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() yn dileu'r cydrannau penodol a enwir o restr colofnau defnyddiwrfelly gallwch chi ystyried hoist() fel symud cydrannau o restr fewnol ffrâm dyddiad i'w lefel uchaf.
Storfeydd Github
Aliniad rhestr gh_repos rydym yn dechrau yn yr un modd trwy ei drosi i tibble:
Y tro hwn yr elfennau defnyddiwr cynrychioli rhestr o ystorfeydd sy'n eiddo i'r defnyddiwr hwn. Mae pob ystorfa yn arsylwad ar wahân, felly yn ôl y cysyniad o ddata taclus (tua data taclus) dylen nhw ddod yn llinellau newydd, a dyna pam rydyn ni'n defnyddio unnest_longer() ac nid 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
Nawr gallwn ddefnyddio unnest_wider() neu 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
Rhowch sylw i'r defnydd c("owner", "login"): Mae hyn yn ein galluogi i gael y gwerth ail lefel o restr nythu owner. Dull arall yw cael y rhestr gyfan owner ac yna defnyddio'r swyddogaeth unnest_wider() rhowch bob un o'i elfennau mewn colofn:
Yn hytrach na meddwl am ddewis y swyddogaeth gywir unnest_longer() neu unnest_wider() gallwch ddefnyddio unnest_auto(). Mae'r swyddogaeth hon yn defnyddio sawl dull hewristig i ddewis y swyddogaeth fwyaf addas ar gyfer trawsnewid y data, ac yn dangos neges am y dull a ddewiswyd.
got_chars sydd â strwythur union yr un fath â gh_users: Dyma set o restrau a enwir, lle mae pob elfen o'r rhestr fewnol yn disgrifio rhyw briodwedd o gymeriad Game of Thrones. Dwyn got_chars Ar gyfer golwg y tabl, rydyn ni'n dechrau trwy greu ffrâm dyddiad, yn union fel yn yr enghreifftiau blaenorol, ac yna'n trosi pob elfen yn golofn ar wahân:
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>
Strwythur got_chars braidd yn anoddach na gh_users, achos rhai cydrannau rhestr char eu hunain yn rhestr, o ganlyniad rydym yn cael pileri - rhestrau:
Mae eich gweithredoedd pellach yn dibynnu ar nodau'r dadansoddiad. Efallai bod angen i chi roi gwybodaeth ar y llinellau ar gyfer pob llyfr a chyfres y mae'r cymeriad yn ymddangos ynddynt:
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
Neu efallai eich bod am greu tabl sy'n eich galluogi i gydweddu'r cymeriad a'r gwaith:
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
(Sylwch ar y gwerthoedd gwag "" yn y maes title, mae hyn oherwydd gwallau a wnaed wrth fewnbynnu data got_chars: mewn gwirionedd, cymeriadau nad oes teitlau llyfrau a chyfresi teledu cyfatebol ar eu cyfer yn y maes title rhaid iddo fod â fector hyd 0, nid fector hyd 1 sy'n cynnwys y llinyn gwag.)
Gallwn ailysgrifennu'r enghraifft uchod gan ddefnyddio'r swyddogaeth unnest_auto(). Mae'r dull hwn yn gyfleus ar gyfer dadansoddiad un-amser, ond ni ddylech ddibynnu arno unnest_auto() i'w defnyddio'n rheolaidd. Y pwynt yw os bydd eich strwythur data yn newid unnest_auto() yn gallu newid y mecanwaith trawsnewid data a ddewiswyd pe bai'n ehangu colofnau rhestr yn rhesi i ddechrau gan ddefnyddio unnest_longer(), yna pan fydd strwythur y data sy'n dod i mewn yn newid, gellir newid y rhesymeg o blaid unnest_wider(), a gall defnyddio'r dull hwn yn barhaus arwain at gamgymeriadau annisgwyl.
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
Geogodio gyda Google
Nesaf, byddwn yn edrych ar strwythur mwy cymhleth o'r data a gafwyd o wasanaeth geogodio Google. Mae caching credentials yn erbyn y rheolau o weithio gydag API mapiau Google, felly yn gyntaf byddaf yn ysgrifennu papur lapio syml o amgylch yr API. Sydd yn seiliedig ar storio allwedd API Google Maps mewn newidyn amgylchedd; Os nad oes gennych yr allwedd ar gyfer gweithio gyda'r API Google Maps sydd wedi'i storio yn eich newidynnau amgylchedd, ni fydd y darnau cod a gyflwynir yn yr adran hon yn cael eu gweithredu.
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)
}
Mae'r rhestr y mae'r swyddogaeth hon yn ei dychwelyd yn eithaf cymhleth:
Yn ffodus, gallwn ddatrys y broblem o drosi'r data hwn yn ffurf tabl fesul cam gan ddefnyddio swyddogaethau tidyr. I wneud y dasg ychydig yn fwy heriol a realistig, byddaf yn dechrau trwy geogodio ychydig o ddinasoedd:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Byddaf yn trosi'r canlyniad canlyniadol yn tibble, er hwylustod, byddaf yn ychwanegu colofn gyda'r enw dinas cyfatebol.
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]>
Mae'r lefel gyntaf yn cynnwys cydrannau status и result, y gallwn ehangu ag ef 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
nodi hynny results yn rhestr aml-lefel. Mae gan y mwyafrif o ddinasoedd 1 elfen (sy'n cynrychioli gwerth unigryw sy'n cyfateb i'r API geogodio), ond mae gan Springfield ddwy. Gallwn eu tynnu i mewn i linellau ar wahân gyda 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
Nawr mae gan bob un ohonynt yr un cydrannau, y gellir eu gwirio gan ddefnyddio 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
Gallwn ddod o hyd i gyfesurynnau lledred a hydred pob dinas trwy ehangu'r rhestr 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>
Ac yna'r lleoliad y mae angen i chi ehangu ar ei gyfer 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>
Unwaith eto, unnest_auto() yn symleiddio'r gweithrediad a ddisgrifir gyda rhai risgiau a allai gael eu hachosi gan newid strwythur y data sy'n dod i mewn:
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>
Gallwn hefyd edrych ar y cyfeiriad cyntaf ar gyfer pob dinas:
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>
Neu defnyddiwch hoist() ar gyfer plymio aml-lefel i fynd yn uniongyrchol iddo 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]>
Disgograffeg o Sharla Gelfand
Yn olaf, byddwn yn edrych ar y strwythur mwyaf cymhleth - disgograffeg Sharla Gelfand. Fel yn yr enghreifftiau uchod, rydym yn dechrau trwy drosi'r rhestr i ffrâm ddata un golofn, ac yna ei hymestyn fel bod pob cydran yn golofn ar wahân. Hefyd dwi'n trawsnewid y golofn date_added i’r fformat dyddiad ac amser priodol yn 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
Ar y lefel hon, rydym yn cael gwybodaeth ynghylch pryd ychwanegwyd pob disg at ddisgograffeg Sharla, ond nid ydym yn gweld unrhyw ddata am y disgiau hynny. I wneud hyn mae angen ehangu'r golofn basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Yn anffodus, byddwn yn derbyn gwall, oherwydd ... tu mewn i'r rhestr basic_information mae colofn o'r un enw basic_information. Os bydd gwall o'r fath yn digwydd, er mwyn pennu ei achos yn gyflym, gallwch ei ddefnyddio names_repair = "unique":
Yna gallwch chi ymuno â nhw yn ôl i'r set ddata wreiddiol yn ôl yr angen.
Casgliad
I graidd y llyfrgell tidyverse yn cynnwys llawer o becynnau defnyddiol wedi'u huno gan athroniaeth prosesu data gyffredin.
Yn yr erthygl hon rydym yn edrych ar y teulu o swyddogaethau unnest_*(), sydd wedi'u hanelu at weithio gyda thynnu elfennau o restrau nythu. Mae'r pecyn hwn yn cynnwys llawer o nodweddion defnyddiol eraill sy'n ei gwneud hi'n haws trosi data yn ôl y cysyniad Data Taclus.