ProHoster > Օրագիր > Վարչակազմը > Ընդլայնվող ներդիր սյունակներ - ցուցակներ R լեզվով (tidyr փաթեթ և unnest ընտանիքի գործառույթներ)
Ընդլայնվող ներդիր սյունակներ - ցուցակներ R լեզվով (tidyr փաթեթ և unnest ընտանիքի գործառույթներ)
Շատ դեպքերում, երբ աշխատում եք 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Սա անվանված ցուցակների հավաքածու է, որտեղ ներքին ցանկի յուրաքանչյուր տարր նկարագրում է «Գահերի խաղի» կերպարի որոշ հատկանիշ: Բերելով 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 Քարտեզների API բանալին շրջակա միջավայրի փոփոխականում պահելու վրա. Եթե դուք չունեք ձեր միջավայրի փոփոխականներում պահված Google Քարտեզների 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 տարր (որը ներկայացնում է գեոկոդավորման 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 համապատասխան օրվա և ժամի ձևաչափով Ռ.
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_*(), որոնք նպատակաուղղված են ներդիր ցուցակներից տարրեր հանելու հետ աշխատելուն։ Այս փաթեթը պարունակում է բազմաթիվ այլ օգտակար հատկություններ, որոնք հեշտացնում են տվյալների փոխակերպումն ըստ հայեցակարգի Կոկիկ տվյալներ.