ProHoster > Блог > басқарма > Кірістірілген бағандарды кеңейту - R тілін қолданатын тізімдер (tidyr бумасы және ұясыз отбасының функциялары)
Кірістірілген бағандарды кеңейту - R тілін қолданатын тізімдер (tidyr бумасы және ұясыз отбасының функциялары)
Көп жағдайда API-дан алынған жауаппен немесе күрделі ағаш құрылымы бар кез келген басқа деректермен жұмыс істегенде, сіз JSON және XML пішімдерімен бетпе-бет келесіз.
Бұл пішімдердің көптеген артықшылықтары бар: олар деректерді өте ықшам сақтайды және ақпараттың қажетсіз қайталануын болдырмауға мүмкіндік береді.
Бұл форматтардың кемшілігі оларды өңдеу мен талдаудың күрделілігі болып табылады. Құрылымы жоқ деректерді есептеулерде пайдалану және оған визуализацияны құру мүмкін емес.
Бұл мақала басылымның логикалық жалғасы болып табылады "R пакеті tidyr және оның жаңа функциялары pivot_longer және pivot_wider". Ол сізге құрылымдалмаған деректер құрылымдарын пакетті пайдаланып таныс және талдауға жарамды кестелік пішінге келтіруге көмектеседі. tidyr, кітапхананың өзегіне кіреді tidyverse, және оның функциялар тобы unnest_*().
Мазмұны
Егер сіз деректерді талдауға қызығушылық танытсаңыз, сізді мені қызықтыруы мүмкін жеделхат и YouTube арналар. Мазмұнның көп бөлігі R тіліне арналған.
Тіктөртбұрыш(аудармашының ескертпесі, мен бұл терминге сәйкес аударма нұсқаларын таппадым, сондықтан оны сол күйінде қалдырамыз.) кірістірілген массивтері бар құрылымдалмаған деректерді таныс жолдар мен бағандардан тұратын екі өлшемді кестеге келтіру процесі болып табылады. IN tidyr Кірістірілген тізім бағандарын кеңейтуге және деректерді тікбұрышты, кестелік пішінге азайтуға көмектесетін бірнеше функциялар бар:
unnest_longer() бағандар тізімінің әрбір элементін алып, жаңа жолды жасайды.
unnest_wider() бағандар тізімінің әрбір элементін алып, жаңа баған жасайды.
unnest_auto() қай функцияны пайдалану жақсы екенін автоматты түрде анықтайды unnest_longer() немесе unnest_wider().
hoist() ұқсас unnest_wider() бірақ тек көрсетілген құрамдастарды таңдайды және ұя салудың бірнеше деңгейімен жұмыс істеуге мүмкіндік береді.
Екі өлшемді кестеге кірістірудің бірнеше деңгейлері бар құрылымдалмаған деректерді әкелумен байланысты мәселелердің көпшілігін аталған функцияларды dplyr-мен біріктіру арқылы шешуге болады.
Бұл әдістерді көрсету үшін біз пакетті қолданамыз repurrrsive, ол веб API интерфейсінен алынған бірнеше күрделі, көп деңгейлі тізімдерді қамтамасыз етеді.
Бастайық gh_users, алты GitHub пайдаланушысы туралы ақпаратты қамтитын тізім. Алдымен тізімді түрлендірейік gh_users в медицинале жақтау:
users <- tibble( user = gh_users )
Бұл аздап қарама-қайшы көрінеді: неге тізімді беру керек gh_users, неғұрлым күрделі деректер құрылымына? Бірақ деректер кадрының үлкен артықшылығы бар: ол бірнеше векторларды біріктіреді, осылайша барлығы бір нысанда бақыланады.
Әрбір нысан элементі users әрбір элемент бағанды көрсететін атаулы тізім болып табылады.
Бұл жағдайда бізде 30 бағаннан тұратын кесте бар және олардың көпшілігі бізге қажет емес, сондықтан біз оның орнына жасай аламыз. unnest_wider() пайдалану hoist(). hoist() сияқты синтаксисті пайдаланып таңдалған компоненттерді шығаруға мүмкіндік береді 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() көрсетілген аталған құрамдастарды бағандар тізімінен жояды пайдаланушысондықтан қарастыра аласыз hoist() құрамдастарды күн кадрының ішкі тізімінен оның жоғарғы деңгейіне жылжыту сияқты.
Github репозиторийлері
Тізімді туралау gh_repos біз оны түрлендіру арқылы дәл осылай бастаймыз tibble:
Бұл жолы элементтер пайдаланушы осы пайдаланушыға тиесілі репозиторийлердің тізімін көрсетеді. Әрбір репозиторий жеке бақылау болып табылады, сондықтан ұқыпты деректер тұжырымдамасына сәйкес (шамамен жинақталған деректер) олар жаңа сызықтарға айналуы керек, сондықтан біз қолданамыз unnest_longer() және жоқ 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
Енді біз пайдалана аламыз 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
Қолдануға назар аударыңыз c("owner", "login"): Бұл кірістірілген тізімнен екінші деңгей мәнін алуға мүмкіндік береді owner. Балама тәсіл - бүкіл тізімді алу owner содан кейін функцияны пайдаланыңыз unnest_wider() оның әрбір элементін бағанға қойыңыз:
Дұрыс функцияны таңдау туралы ойлаудың орнына unnest_longer() немесе unnest_wider() пайдалана аласыз unnest_auto(). Бұл функция деректерді түрлендіру үшін ең қолайлы функцияны таңдау үшін бірнеше эвристикалық әдістерді пайдаланады және таңдалған әдіс туралы хабарды көрсетеді.
got_chars ұқсас құрылымы бар gh_users: Бұл ішкі тізімнің әрбір элементі Game of Thrones кейіпкерінің кейбір атрибутын сипаттайтын аталған тізімдер жинағы. әкелу got_chars Кесте көрінісі үшін біз алдыңғы мысалдардағыдай күн шеңберін жасаудан бастаймыз, содан кейін әрбір элементті бөлек бағанға түрлендіреміз:
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>
құрылым got_chars қарағанда біршама қиынырақ gh_users, өйткені кейбір тізім компоненттері char өздері тізім, нәтижесінде біз тіректерді аламыз - тізімдер:
Сіздің әрі қарайғы әрекеттеріңіз талдау мақсаттарына байланысты. Мүмкін сізге кейіпкер пайда болған әрбір кітап пен серияның жолдарына ақпарат қою керек болуы мүмкін:
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
(Бос мәндерге назар аударыңыз "" алаңда title, бұл деректерді енгізу кезінде жіберілген қателерге байланысты got_chars: шын мәнінде, өрісте сәйкес кітап пен телехикаялардың атаулары жоқ кейіпкерлер title бос жолды қамтитын ұзындығы 0 вектор емес, ұзындығы 1 векторы болуы керек.)
Функцияның көмегімен жоғарыдағы мысалды қайта жаза аламыз unnest_auto(). Бұл тәсіл бір реттік талдау үшін ыңғайлы, бірақ оған сенбеу керек unnest_auto() тұрақты негізде пайдалануға арналған. Мәселе мынада, егер деректер құрылымы өзгерсе unnest_auto() бастапқыда тізім бағандарын жолдарға кеңейтсе, таңдалған деректерді түрлендіру механизмін өзгерте алады unnest_longer(), содан кейін кіріс деректер құрылымы өзгерген кезде, логиканы пайдасына өзгертуге болады unnest_wider(), және бұл тәсілді үнемі пайдалану күтпеген қателерге әкелуі мүмкін.
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
Google көмегімен геокодтау
Әрі қарай, Google геокодтау қызметінен алынған деректердің күрделі құрылымын қарастырамыз. Тіркелгі деректерін кэштеу Google Maps API интерфейсімен жұмыс істеу ережелеріне қайшы келеді, сондықтан мен алдымен API айналасында қарапайым орауыш жазамын. Бұл Google Maps API кілтін орта айнымалысында сақтауға негізделген; Егер сізде ортаның айнымалы мәндерінде сақталған Google Maps API интерфейсімен жұмыс істеу кілті болмаса, осы бөлімде берілген код фрагменттері орындалмайды.
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)
}
Бақытымызға орай, біз функцияларды пайдалана отырып, бұл деректерді кезең-кезеңімен кестелік пішінге түрлендіру мәселесін шеше аламыз tidyr. Тапсырманы біршама қиынырақ және шынайы ету үшін мен бірнеше қалаларды геокодтаудан бастаймын:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Алынған нәтижені түрлендіремін tibble, ыңғайлы болу үшін мен сәйкес қала атауы бар баған қосамын.
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]>
Бірінші деңгей компоненттерден тұрады status и result, біз онымен кеңейте аламыз 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
Осыған назар аударыңыз results көп деңгейлі тізім болып табылады. Көптеген қалаларда 1 элемент бар (geocoding API-ге сәйкес бірегей мәнді білдіреді), бірақ Спрингфилдте екеуі бар. Біз оларды бөлек сызықтарға тарта аламыз 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
Енді олардың барлығы бірдей құрамдастарға ие, оларды пайдалану арқылы тексеруге болады 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
Біз тізімді кеңейту арқылы әр қаланың ендік пен бойлық координаттарын таба аламыз 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>
Содан кейін кеңейту қажет орын 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>
Тағы, unnest_auto() сипатталған операцияны кіріс деректер құрылымын өзгертуден туындауы мүмкін кейбір тәуекелдермен жеңілдетеді:
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>
Біз сондай-ақ әрбір қаланың бірінші мекенжайын қарастыра аламыз:
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>
Немесе пайдаланыңыз hoist() тікелей өту үшін көп деңгейлі сүңгу үшін 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]>
Шарла Гельфандтың дискографиясы
Соңында біз ең күрделі құрылымды - Шарла Гельфандтың дискографиясын қарастырамыз. Жоғарыдағы мысалдардағыдай, біз тізімді бір бағанды деректер кадрына түрлендіруден бастаймыз, содан кейін оны әрбір компонент жеке баған болатындай кеңейтеміз. Сондай-ақ мен бағанды түрлендіремін date_added 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.
Өкінішке орай, біз қате аламыз, себебі... тізімнің ішінде basic_information аттас баған бар basic_information. Егер мұндай қате орын алса, оның себебін жылдам анықтау үшін сіз пайдалана аласыз names_repair = "unique":
Қажет болса, оларды бастапқы деректер жиынына қайта қосуға болады.
қорытынды
Кітапхананың өзегіне tidyverse жалпы деректерді өңдеу философиясымен біріктірілген көптеген пайдалы пакеттерді қамтиды.
Бұл мақалада біз функциялар тобын қарастырдық unnest_*(), олар кірістірілген тізімдерден элементтерді шығарумен жұмыс істеуге бағытталған. Бұл пакетте тұжырымдамаға сәйкес деректерді түрлендіруді жеңілдететін көптеген басқа пайдалы мүмкіндіктер бар Тиісті деректер.