کڅوړه منظم په R ژبه کې یو له خورا مشهور کتابتونونو څخه په اصلي کې شامل دی - منظم.
د کڅوړې اصلي هدف دا دی چې معلومات په دقیق شکل کې راوړي.
لا دمخه په Habré کې شتون لري
S.J.K.: آیا راټولول () او خپرول () به ضایع شي؟
هیډلي ویکم: تر یو حده. موږ به نور د دې دندو کارولو وړاندیز ونه کړو او په دوی کې بګونه حل کړو ، مګر دوی به په خپل اوسني حالت کې په کڅوړه کې شتون ته دوام ورکړي.
منځپانګې
که تاسو د معلوماتو تحلیل سره علاقه لرئ ، تاسو ممکن زما سره علاقه ولرئ
د TidyData مفهوم اصلي دندې په ټیډیر کڅوړه کې شاملې دي د پراخه څخه اوږد فارمیټ ته د معلوماتو بدلولو لپاره نوی مفهوم او برعکس د tidyr 0.8.3.9000 ترټولو اوسنی نسخه نصب کول نوي ځانګړتیاو ته لیږد د پراخه څخه اوږد فارمیټ ته د معلوماتو بدلولو ساده مثال نرخونه د څو ارزښتونو په کارولو سره مشخصات (.value) د نیټې چوکاټونه له اوږد څخه پراخه شکل ته بدلول د نوي ټیډیر مفهوم سره د کار کولو څو پرمختللي مثالونه پایلې
د TidyData مفهوم
هدف منظم - تاسو سره مرسته وکړئ چې معلومات په تش په نامه پاک فارم ته راوړو. پاک معلومات هغه معلومات دي چیرې چې:
- هر متغیر په کالم کې دی.
- هر مشاهده یو تار دی.
- هر ارزښت یو حجره ده.
دا د ډیټا سره کار کول خورا اسانه او ډیر اسانه دي چې د تحلیل ترسره کولو پرمهال په منظم ډیټا کې وړاندې کیږي.
اصلي دندې په ټیډیر کڅوړه کې شاملې دي
tidyr د دندو یوه ټولګه لري چې د جدولونو د بدلولو لپاره ډیزاین شوي:
fill()
- د پخوانیو ارزښتونو سره په کالم کې د ورک شوي ارزښتونو ډکول؛separate()
- د جلا کونکي په کارولو سره یو ساحه په څو برخو ویشي؛unite()
- د څو ساحو سره یوځای کولو عملیات ترسره کوي، د فعالیت معکوس عملseparate()
;pivot_longer()
- یو فنکشن چې ډیټا له پراخه فارمیټ څخه اوږد فارمیټ ته بدلوي؛pivot_wider()
- یو فنکشن چې ډیټا له اوږد فارمیټ څخه پراخه فارمیټ ته بدلوي. د فعالیت لخوا ترسره شوي یو برعکس عملیاتpivot_longer()
.gather()
زوړ - یو فنکشن چې ډیټا له پراخه فارمیټ څخه اوږد فارمیټ ته بدلوي؛spread()
زوړ - یو فنکشن چې ډیټا له اوږد فارمیټ څخه پراخه فارمیټ ته بدلوي. د فعالیت لخوا ترسره شوي یو برعکس عملیاتgather()
.
د پراخه څخه اوږد فارمیټ ته د معلوماتو بدلولو لپاره نوی مفهوم او برعکس
پخوا، د دې ډول بدلون لپاره افعال کارول کیده gather()
и spread()
. د دې دندو د شتون په کلونو کې ، دا څرګنده شوه چې د ډیری کاروونکو لپاره ، د کڅوړې لیکوال په شمول ، د دې افعالو نومونه او د دوی دلیلونه خورا څرګند نه و ، او د دوی په موندلو او پوهیدو کې یې ستونزې رامینځته کړې چې کوم دا افعال بدلوي. د نیټې چوکاټ له پراخ څخه تر اوږد فارمیټ پورې، او برعکس.
په دې اړه، په منظم دوه نوي، مهم فعالیتونه اضافه شوي چې د نیټې چوکاټونو بدلولو لپاره ډیزاین شوي.
نوې بڼې pivot_longer()
и pivot_wider()
په کڅوړه کې د ځینو ځانګړتیاو څخه الهام اخیستی cdata، د جان ماونټ او نینا زومیل لخوا رامینځته شوی.
د tidyr 0.8.3.9000 ترټولو اوسنی نسخه نصب کول
د کڅوړې نوې، خورا اوسنی نسخه نصبولو لپاره منظم 0.8.3.9000، چیرې چې نوې ځانګړتیاوې شتون لري، لاندې کوډ وکاروئ.
devtools::install_github("tidyverse/tidyr")
د لیکلو په وخت کې، دا دندې یوازې په GitHub کې د کڅوړې dev نسخه کې شتون لري.
نوي ځانګړتیاو ته لیږد
په حقیقت کې، د نویو دندو سره کار کولو لپاره د زړو سکریپټونو لیږدول ستونزمن ندي؛ د ښه پوهیدو لپاره، زه به د پخوانیو دندو اسنادو څخه یوه بیلګه واخلم او وښیم چې څنګه ورته عملیات د نویو په کارولو سره ترسره کیږي. pivot_*()
دندې
پراخه بڼه اوږده بڼه ته واړوئ.
د راټولولو فنکشن اسنادو څخه کوډ مثال
# example
library(dplyr)
stocks <- data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
# old
stocks_gather <- stocks %>% gather(key = stock,
value = price,
-time)
# new
stocks_long <- stocks %>% pivot_longer(cols = -time,
names_to = "stock",
values_to = "price")
اوږده بڼه په پراخه بڼه بدلول.
د خپریدو فنکشن اسنادو څخه کوډ مثال
# old
stocks_spread <- stocks_gather %>% spread(key = stock,
value = price)
# new
stock_wide <- stocks_long %>% pivot_wider(names_from = "stock",
values_from = "price")
ځکه سره د کار کولو په پورته مثالونو کې pivot_longer()
и pivot_wider()
په اصلي جدول کې زیرمې هیڅ کالم په دلیلونو کې لیست شوي ندي نومونه_ته и ارزښتونه_ته د دوی نومونه باید د حوالې نښه وي.
یو میز چې تاسو سره به په اسانۍ سره مرسته وکړي چې څنګه د نوي مفهوم سره کار کولو ته لاړشئ منظم.
د لیکوال څخه یادونه
لاندې ټول متن تطابق دی، زه به حتی وړیا ژباړه ووایم
vignettes د رسمي پاک کتابتون ویب پاڼې څخه.
د پراخه څخه اوږد فارمیټ ته د معلوماتو بدلولو ساده مثال
pivot_longer ()
- د کالمونو شمیر کمولو او د قطارونو شمیر په زیاتولو سره د ډیټا سیټونه اوږد کوي.
په مقاله کې وړاندې شوي مثالونو چلولو لپاره، تاسو باید لومړی اړین کڅوړې وصل کړئ:
library(tidyr)
library(dplyr)
library(readr)
راځئ چې ووایو چې موږ د یوې سروې پایلو سره یو جدول لرو چې (د نورو شیانو په مینځ کې) له خلکو څخه د دوی د مذهب او کلني عاید په اړه پوښتل شوي:
#> # A tibble: 18 x 11
#> religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k`
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Agnostic 27 34 60 81 76 137
#> 2 Atheist 12 27 37 52 35 70
#> 3 Buddhist 27 21 30 34 33 58
#> 4 Catholic 418 617 732 670 638 1116
#> 5 Don’t k… 15 14 15 11 10 35
#> 6 Evangel… 575 869 1064 982 881 1486
#> 7 Hindu 1 9 7 9 11 34
#> 8 Histori… 228 244 236 238 197 223
#> 9 Jehovah… 20 27 24 24 21 30
#> 10 Jewish 19 19 25 25 30 95
#> # … with 8 more rows, and 4 more variables: `$75-100k` <dbl>,
#> # `$100-150k` <dbl>, `>150k` <dbl>, `Don't know/refused` <dbl>
دا جدول په قطارونو کې د ځواب ورکوونکو مذهب معلومات لري، او د عاید کچه د کالمونو په نومونو کې ویشل شوي. د هرې کټګورۍ څخه د ځواب ویونکو شمیر په حجرو کې د مذهب او عایداتو په مقایسه ارزښتونو کې ساتل کیږي. د میز په پاک، سم شکل کې راوستلو لپاره، دا د کارولو لپاره کافی دی pivot_longer()
:
pew %>%
pivot_longer(cols = -religion, names_to = "income", values_to = "count")
pew %>%
pivot_longer(cols = -religion, names_to = "income", values_to = "count")
#> # A tibble: 180 x 3
#> religion income count
#> <chr> <chr> <dbl>
#> 1 Agnostic <$10k 27
#> 2 Agnostic $10-20k 34
#> 3 Agnostic $20-30k 60
#> 4 Agnostic $30-40k 81
#> 5 Agnostic $40-50k 76
#> 6 Agnostic $50-75k 137
#> 7 Agnostic $75-100k 122
#> 8 Agnostic $100-150k 109
#> 9 Agnostic >150k 84
#> 10 Agnostic Don't know/refused 96
#> # … with 170 more rows
د فعالیت دلیلونه pivot_longer()
- لومړی دلیل کالرونه، تشریح کوي چې کوم کالمونه باید یوځای شي. په دې حالت کې، ټول کالمونه پرته وخت.
- دلیل نومونه_ته د متغیر نوم ورکوي چې د هغه کالمونو له نومونو څخه رامینځته کیږي چې موږ یې یوځای کړي.
- ارزښتونه_ته د یو متغیر نوم ورکوي چې د یوځای شوي کالمونو حجرو ارزښتونو کې زیرمه شوي ډیټا څخه رامینځته کیږي.
نرخونه
دا د کڅوړې نوی فعالیت دی منظم، کوم چې دمخه شتون نلري کله چې د میراث دندو سره کار کوي.
یو مشخصات د ډیټا چوکاټ دی، چې هر قطار یې د نوي محصول نیټې چوکاټ کې یو کالم سره مطابقت لري، او دوه ځانګړي کالمونه چې پیل کیږي:
- نوم د اصلي کالم نوم لري.
- ارزښت د کالم نوم لري چې د حجرو ارزښتونه لري.
د مشخصاتو پاتې کالمونه منعکس کوي چې څنګه نوی کالم به د فشار شوي کالمونو نوم ښکاره کړي نوم.
مشخصات د کالم نوم کې ذخیره شوي میټاډاټا تشریح کوي، د هر کالم لپاره یو قطار او د هر متغیر لپاره یو کالم، د کالم نوم سره یوځای، دا تعریف ممکن په اوس وخت کې ګډوډ ښکاري، مګر د یو څو مثالونو په کتلو سره به ډیر شي. روښانه
د مشخصاتو نقطه دا ده چې تاسو کولی شئ د ډیټا فریم بدلولو لپاره نوي میټاډاټا بیرته ترلاسه کړئ ، تعدیل کړئ او تعریف کړئ.
د مشخصاتو سره کار کولو لپاره کله چې جدول له پراخه فارمیټ څخه اوږد فارمیټ ته واړوئ ، فنکشن وکاروئ pivot_longer_spec()
.
دا فنکشن څنګه کار کوي دا دی چې دا د نیټې هر چوکاټ اخلي او خپل میټاډاټا په پورته بیان شوي طریقه تولیدوي.
د مثال په توګه، راځئ چې د چا ډیټاسیټ واخلو چې د کڅوړې سره چمتو شوی منظم. دا ډیټا سیټ هغه معلومات لري چې د نري رنځ د پیښو په اړه د نړیوال روغتیا سازمان لخوا چمتو شوي.
who
#> # A tibble: 7,240 x 60
#> country iso2 iso3 year new_sp_m014 new_sp_m1524 new_sp_m2534
#> <chr> <chr> <chr> <int> <int> <int> <int>
#> 1 Afghan… AF AFG 1980 NA NA NA
#> 2 Afghan… AF AFG 1981 NA NA NA
#> 3 Afghan… AF AFG 1982 NA NA NA
#> 4 Afghan… AF AFG 1983 NA NA NA
#> 5 Afghan… AF AFG 1984 NA NA NA
#> 6 Afghan… AF AFG 1985 NA NA NA
#> 7 Afghan… AF AFG 1986 NA NA NA
#> 8 Afghan… AF AFG 1987 NA NA NA
#> 9 Afghan… AF AFG 1988 NA NA NA
#> 10 Afghan… AF AFG 1989 NA NA NA
#> # … with 7,230 more rows, and 53 more variables
راځئ چې د هغې مشخصات جوړ کړو.
spec <- who %>%
pivot_longer_spec(new_sp_m014:newrel_f65, values_to = "count")
#> # A tibble: 56 x 3
#> .name .value name
#> <chr> <chr> <chr>
#> 1 new_sp_m014 count new_sp_m014
#> 2 new_sp_m1524 count new_sp_m1524
#> 3 new_sp_m2534 count new_sp_m2534
#> 4 new_sp_m3544 count new_sp_m3544
#> 5 new_sp_m4554 count new_sp_m4554
#> 6 new_sp_m5564 count new_sp_m5564
#> 7 new_sp_m65 count new_sp_m65
#> 8 new_sp_f014 count new_sp_f014
#> 9 new_sp_f1524 count new_sp_f1524
#> 10 new_sp_f2534 count new_sp_f2534
#> # … with 46 more rows
برخو کې هیواد, isoxnumx, isoxnumx لا دمخه متغیرات دي. زموږ دنده د کالمونو سره فلپ کول دي new_sp_m014 په newrel_f65.
د دې کالمونو نومونه لاندې معلومات ذخیره کوي:
- مختاړی
new_
دا په ګوته کوي چې کالم د نري رنځ د نویو پیښو په اړه معلومات لري، د نیټې اوسنی چوکاټ یوازې د نویو ناروغیو په اړه معلومات لري، نو په اوسني شرایطو کې دا مخکینۍ هیڅ معنی نه لري. sp
/rel
/sp
/ep
د ناروغۍ د تشخیص یوه طریقه بیانوي.m
/f
د ناروغ جنس.014
/1524
/2535
/3544
/4554
/65
د ناروغ عمر حد.
موږ کولی شو دا کالمونه د فنکشن په کارولو سره تقسیم کړو extract()
د منظم بیان کارول.
spec <- spec %>%
extract(name, c("diagnosis", "gender", "age"), "new_?(.*)_(.)(.*)")
#> # A tibble: 56 x 5
#> .name .value diagnosis gender age
#> <chr> <chr> <chr> <chr> <chr>
#> 1 new_sp_m014 count sp m 014
#> 2 new_sp_m1524 count sp m 1524
#> 3 new_sp_m2534 count sp m 2534
#> 4 new_sp_m3544 count sp m 3544
#> 5 new_sp_m4554 count sp m 4554
#> 6 new_sp_m5564 count sp m 5564
#> 7 new_sp_m65 count sp m 65
#> 8 new_sp_f014 count sp f 014
#> 9 new_sp_f1524 count sp f 1524
#> 10 new_sp_f2534 count sp f 2534
#> # … with 46 more rows
مهرباني وکړئ کالم ته پام وکړئ نوم باید بدله پاتې شي ځکه چې دا زموږ د اصلي ډیټا سیټ کالم نومونو کې شاخص دی.
جنس او عمر (کالمونه جندر и عمر) ثابت او پیژندل شوي ارزښتونه لري، نو سپارښتنه کیږي چې دا کالمونه په فکتورونو بدل کړئ:
spec <- spec %>%
mutate(
gender = factor(gender, levels = c("f", "m")),
age = factor(age, levels = unique(age), ordered = TRUE)
)
په نهایت کې ، د توضیحاتو پلي کولو لپاره چې موږ د اصلي نیټې چوکاټ ته رامینځته کړی چې موږ باید یو دلیل وکاروو مشخصاتو په فعالیت کې pivot_longer()
.
who %>% pivot_longer(spec = spec)
#> # A tibble: 405,440 x 8
#> country iso2 iso3 year diagnosis gender age count
#> <chr> <chr> <chr> <int> <chr> <fct> <ord> <int>
#> 1 Afghanistan AF AFG 1980 sp m 014 NA
#> 2 Afghanistan AF AFG 1980 sp m 1524 NA
#> 3 Afghanistan AF AFG 1980 sp m 2534 NA
#> 4 Afghanistan AF AFG 1980 sp m 3544 NA
#> 5 Afghanistan AF AFG 1980 sp m 4554 NA
#> 6 Afghanistan AF AFG 1980 sp m 5564 NA
#> 7 Afghanistan AF AFG 1980 sp m 65 NA
#> 8 Afghanistan AF AFG 1980 sp f 014 NA
#> 9 Afghanistan AF AFG 1980 sp f 1524 NA
#> 10 Afghanistan AF AFG 1980 sp f 2534 NA
#> # … with 405,430 more rows
هر څه چې موږ یې کړي دي په لاندې ډول په سکیماټیک ډول ښودل کیدی شي:
د څو ارزښتونو په کارولو سره مشخصات (.value)
په پورته مثال کې، د مشخصاتو کالم ارزښت یوازې یو ارزښت لري، په ډیری مواردو کې دا قضیه ده.
مګر کله ناکله یو حالت رامینځته کیدی شي کله چې تاسو اړتیا لرئ د کالمونو څخه ډیټا راټول کړئ په ارزښتونو کې د مختلف ډیټا ډولونو سره. د میراث فعالیت کارول spread()
دا به ډیر ستونزمن وي.
د لاندې مثال څخه اخیستل شوی
راځئ چې د روزنې ډیټا چوکاټ جوړ کړو.
family <- tibble::tribble(
~family, ~dob_child1, ~dob_child2, ~gender_child1, ~gender_child2,
1L, "1998-11-26", "2000-01-29", 1L, 2L,
2L, "1996-06-22", NA, 2L, NA,
3L, "2002-07-11", "2004-04-05", 2L, 2L,
4L, "2004-10-10", "2009-08-27", 1L, 1L,
5L, "2000-12-05", "2005-02-28", 2L, 1L,
)
family <- family %>% mutate_at(vars(starts_with("dob")), parse_date)
#> # A tibble: 5 x 5
#> family dob_child1 dob_child2 gender_child1 gender_child2
#> <int> <date> <date> <int> <int>
#> 1 1 1998-11-26 2000-01-29 1 2
#> 2 2 1996-06-22 NA 2 NA
#> 3 3 2002-07-11 2004-04-05 2 2
#> 4 4 2004-10-10 2009-08-27 1 1
#> 5 5 2000-12-05 2005-02-28 2 1
د جوړ شوي نیټې چوکاټ په هر قطار کې د یوې کورنۍ د ماشومانو معلومات لري. کورنۍ ممکن یو یا دوه ماشومان ولري. د هر ماشوم لپاره، د زیږون او جنسیت په اړه معلومات چمتو شوي، او د هر ماشوم لپاره ډاټا په جلا کالمونو کې دي؛ زموږ دنده دا ده چې دا ډاټا د تحلیل لپاره سم شکل ته راوړو.
مهرباني وکړئ په یاد ولرئ چې موږ د هر ماشوم په اړه د معلوماتو سره دوه متغیرونه لرو: د دوی جنس او د زیږون نیټه (د مخکیني کالمونه ډوپ د زیږون نیټه، د مخکیني کالمونو سره جندر د ماشوم جنس لري). متوقع پایله دا ده چې دوی باید په جلا کالمونو کې څرګند شي. موږ کولی شو دا د یو مشخصاتو په رامینځته کولو سره ترسره کړو په کوم کې چې کالم .value
دوه مختلف معنی به ولري.
spec <- family %>%
pivot_longer_spec(-family) %>%
separate(col = name, into = c(".value", "child"))%>%
mutate(child = parse_number(child))
#> # A tibble: 4 x 3
#> .name .value child
#> <chr> <chr> <dbl>
#> 1 dob_child1 dob 1
#> 2 dob_child2 dob 2
#> 3 gender_child1 gender 1
#> 4 gender_child2 gender 2
نو، راځئ چې د پورته کوډ لخوا ترسره شوي کړنو ته یو ګام ګام په نظر کې ونیسو.
pivot_longer_spec(-family)
- یو مشخصات رامینځته کړئ چې د کورنۍ کالم پرته ټول موجود کالمونه فشاروي.separate(col = name, into = c(".value", "child"))
- کالم وویشئ نوم، کوم چې د سرچینې ساحو نومونه لري، د انډر سکور په کارولو سره او په کالمونو کې پایله شوي ارزښتونه داخلوي ارزښت и ماشوم.mutate(child = parse_number(child))
- د ساحې ارزښتونه بدل کړئ ماشوم له متن څخه د عددي معلوماتو ډول ته.
اوس موږ کولی شو د پایلې مشخصات په اصلي ډیټا فریم کې پلي کړو او میز مطلوب شکل ته راوړو.
family %>%
pivot_longer(spec = spec, na.rm = T)
#> # A tibble: 9 x 4
#> family child dob gender
#> <int> <dbl> <date> <int>
#> 1 1 1 1998-11-26 1
#> 2 1 2 2000-01-29 2
#> 3 2 1 1996-06-22 2
#> 4 3 1 2002-07-11 2
#> 5 3 2 2004-04-05 2
#> 6 4 1 2004-10-10 1
#> 7 4 2 2009-08-27 1
#> 8 5 1 2000-12-05 2
#> 9 5 2 2005-02-28 1
موږ استدلال کاروو na.rm = TRUE
ځکه چې د معلوماتو اوسنۍ بڼه د غیر موجود کتنو لپاره د اضافي قطارونو رامینځته کولو مجبوروي. ځکه کورنۍ 2 یوازې یو ماشوم لري na.rm = TRUE
تضمین کوي چې کورنۍ 2 به په محصول کې یو قطار ولري.
د نیټې چوکاټونه له اوږد څخه پراخه شکل ته بدلول
pivot_wider()
- برعکس بدلون دی، او برعکس د قطارونو شمیر کمولو سره د نیټې چوکاټ د کالمونو شمیر زیاتوي.
دا ډول بدلون په خورا ندرت سره د ډیټا دقیق شکل ته راوړلو لپاره کارول کیږي ، په هرصورت ، دا تخنیک په پریزنټشنونو کې کارول شوي د پیوټ میزونو رامینځته کولو لپاره ، یا د ځینې نورو وسیلو سره ادغام لپاره ګټور کیدی شي.
په حقیقت کې دندې pivot_longer()
и pivot_wider()
متضاد دي، او یو بل ته برعکس عملونه تولیدوي، د بیلګې په توګه: df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec)
и df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec)
اصلي df به بیرته راولي.
په پراخه بڼه کې د میز بدلولو ترټولو ساده مثال
د ښودلو لپاره چې فعالیت څنګه کار کوي pivot_wider()
موږ به ډیټا سیټ وکاروو ماهي_مقالې، کوم چې پدې اړه معلومات ذخیره کوي چې څنګه مختلف سټیشنونه د سیند په اوږدو کې د کبانو حرکت ثبتوي.
#> # A tibble: 114 x 3
#> fish station seen
#> <fct> <fct> <int>
#> 1 4842 Release 1
#> 2 4842 I80_1 1
#> 3 4842 Lisbon 1
#> 4 4842 Rstr 1
#> 5 4842 Base_TD 1
#> 6 4842 BCE 1
#> 7 4842 BCW 1
#> 8 4842 BCE2 1
#> 9 4842 BCW2 1
#> 10 4842 MAE 1
#> # … with 104 more rows
په ډیرو مواردو کې، دا جدول به ډیر معلوماتي او کارول اسانه وي که تاسو د هر سټیشن لپاره په جلا کالم کې معلومات وړاندې کړئ.
fish_encounters %>% pivot_wider(names_from = station, values_from = seen)
fish_encounters %>% pivot_wider(names_from = station, values_from = seen)
#> # A tibble: 19 x 12
#> fish Release I80_1 Lisbon Rstr Base_TD BCE BCW BCE2 BCW2 MAE
#> <fct> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 4842 1 1 1 1 1 1 1 1 1 1
#> 2 4843 1 1 1 1 1 1 1 1 1 1
#> 3 4844 1 1 1 1 1 1 1 1 1 1
#> 4 4845 1 1 1 1 1 NA NA NA NA NA
#> 5 4847 1 1 1 NA NA NA NA NA NA NA
#> 6 4848 1 1 1 1 NA NA NA NA NA NA
#> 7 4849 1 1 NA NA NA NA NA NA NA NA
#> 8 4850 1 1 NA 1 1 1 1 NA NA NA
#> 9 4851 1 1 NA NA NA NA NA NA NA NA
#> 10 4854 1 1 NA NA NA NA NA NA NA NA
#> # … with 9 more rows, and 1 more variable: MAW <int>
دا ډاټا سیټ یوازې هغه معلومات ثبتوي کله چې کب د سټیشن لخوا کشف شوي وي، د بیلګې په توګه. که کوم کب د کوم سټیشن لخوا ثبت شوی نه وي، نو دا ډاټا به په جدول کې نه وي. دا پدې مانا ده چې محصول به د NA سره ډک شي.
په هرصورت، پدې حالت کې موږ پوهیږو چې د ریکارډ نشتوالی پدې معنی دی چې کب نه و لیدل شوی، نو موږ کولی شو دلیل وکاروو ارزښتونه_ ډکول په فعالیت کې pivot_wider()
او دا ورک شوي ارزښتونه د صفر سره ډک کړئ:
fish_encounters %>% pivot_wider(
names_from = station,
values_from = seen,
values_fill = list(seen = 0)
)
#> # A tibble: 19 x 12
#> fish Release I80_1 Lisbon Rstr Base_TD BCE BCW BCE2 BCW2 MAE
#> <fct> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 4842 1 1 1 1 1 1 1 1 1 1
#> 2 4843 1 1 1 1 1 1 1 1 1 1
#> 3 4844 1 1 1 1 1 1 1 1 1 1
#> 4 4845 1 1 1 1 1 0 0 0 0 0
#> 5 4847 1 1 1 0 0 0 0 0 0 0
#> 6 4848 1 1 1 1 0 0 0 0 0 0
#> 7 4849 1 1 0 0 0 0 0 0 0 0
#> 8 4850 1 1 0 1 1 1 1 0 0 0
#> 9 4851 1 1 0 0 0 0 0 0 0 0
#> 10 4854 1 1 0 0 0 0 0 0 0 0
#> # … with 9 more rows, and 1 more variable: MAW <int>
د ډیری سرچینو متغیرونو څخه د کالم نوم رامینځته کول
تصور وکړئ چې موږ یو میز لرو چې د محصول، هیواد او کال ترکیب لري. د ازموینې نیټې چوکاټ رامینځته کولو لپاره ، تاسو کولی شئ لاندې کوډ چل کړئ:
df <- expand_grid(
product = c("A", "B"),
country = c("AI", "EI"),
year = 2000:2014
) %>%
filter((product == "A" & country == "AI") | product == "B") %>%
mutate(value = rnorm(nrow(.)))
#> # A tibble: 45 x 4
#> product country year value
#> <chr> <chr> <int> <dbl>
#> 1 A AI 2000 -2.05
#> 2 A AI 2001 -0.676
#> 3 A AI 2002 1.60
#> 4 A AI 2003 -0.353
#> 5 A AI 2004 -0.00530
#> 6 A AI 2005 0.442
#> 7 A AI 2006 -0.610
#> 8 A AI 2007 -2.77
#> 9 A AI 2008 0.899
#> 10 A AI 2009 -0.106
#> # … with 35 more rows
زموږ دنده دا ده چې د ډیټا چوکاټ پراخه کړو ترڅو یو کالم د محصول او هیواد د هر ترکیب لپاره ډیټا ولري. د دې کولو لپاره، یوازې دلیل ته لاړ شئ نومونه_څخه یو ویکتور چې د هغو ساحو نومونه لري چې یوځای کیږي.
df %>% pivot_wider(names_from = c(product, country),
values_from = "value")
#> # A tibble: 15 x 4
#> year A_AI B_AI B_EI
#> <int> <dbl> <dbl> <dbl>
#> 1 2000 -2.05 0.607 1.20
#> 2 2001 -0.676 1.65 -0.114
#> 3 2002 1.60 -0.0245 0.501
#> 4 2003 -0.353 1.30 -0.459
#> 5 2004 -0.00530 0.921 -0.0589
#> 6 2005 0.442 -1.55 0.594
#> 7 2006 -0.610 0.380 -1.28
#> 8 2007 -2.77 0.830 0.637
#> 9 2008 0.899 0.0175 -1.30
#> 10 2009 -0.106 -0.195 1.03
#> # … with 5 more rows
تاسو کولی شئ د فعالیت لپاره مشخصات هم پلي کړئ pivot_wider()
. مګر کله چې وسپارل شي pivot_wider()
مشخصات برعکس تبادله کوي pivot_longer()
: هغه کالمونه چې په کې مشخص شوي دي نومد ارزښتونو په کارولو سره ارزښت او نور کالمونه.
د دې ډیټاسیټ لپاره، تاسو کولی شئ یو دودیز مشخصات تولید کړئ که تاسو غواړئ چې هر ممکنه هیواد او د محصول ترکیب خپل کالم ولري، نه یوازې هغه چې په ډاټا کې شتون لري:
spec <- df %>%
expand(product, country, .value = "value") %>%
unite(".name", product, country, remove = FALSE)
#> # A tibble: 4 x 4
#> .name product country .value
#> <chr> <chr> <chr> <chr>
#> 1 A_AI A AI value
#> 2 A_EI A EI value
#> 3 B_AI B AI value
#> 4 B_EI B EI value
df %>% pivot_wider(spec = spec) %>% head()
#> # A tibble: 6 x 5
#> year A_AI A_EI B_AI B_EI
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 2000 -2.05 NA 0.607 1.20
#> 2 2001 -0.676 NA 1.65 -0.114
#> 3 2002 1.60 NA -0.0245 0.501
#> 4 2003 -0.353 NA 1.30 -0.459
#> 5 2004 -0.00530 NA 0.921 -0.0589
#> 6 2005 0.442 NA -1.55 0.594
د نوي ټیډیر مفهوم سره د کار کولو څو پرمختللي مثالونه
د مثال په توګه د متحده ایالاتو د سرشمیرنې عاید او کرایه ډیټا سیټ په کارولو سره د معلوماتو پاکول.
د معلوماتو ترتیب موږ_کرایه_عايد د 2017 لپاره په متحده ایالاتو کې د هر ایالت لپاره د منځني عاید او کرایې معلومات شامل دي (د معلوماتو سیټ په بسته کې شتون لري منظم سرشمېرنه).
us_rent_income
#> # A tibble: 104 x 5
#> GEOID NAME variable estimate moe
#> <chr> <chr> <chr> <dbl> <dbl>
#> 1 01 Alabama income 24476 136
#> 2 01 Alabama rent 747 3
#> 3 02 Alaska income 32940 508
#> 4 02 Alaska rent 1200 13
#> 5 04 Arizona income 27517 148
#> 6 04 Arizona rent 972 4
#> 7 05 Arkansas income 23789 165
#> 8 05 Arkansas rent 709 5
#> 9 06 California income 29454 109
#> 10 06 California rent 1358 3
#> # … with 94 more rows
په هغه شکل کې چې معلومات په ډیټاسیټ کې زیرمه شوي موږ_کرایه_عايد د دوی سره کار کول خورا نامناسب دي ، نو موږ غواړو د کالمونو سره د ډیټا سیټ رامینځته کړو: کرايه, کرایه_مو, راځي, عاید_مو. د دې مشخصاتو رامینځته کولو لپاره ډیری لارې شتون لري ، مګر اصلي ټکی دا دی چې موږ اړتیا لرو د متغیر ارزښتونو هر ترکیب رامینځته کړو او اټکل/moeاو بیا د کالم نوم پیدا کړئ.
spec <- us_rent_income %>%
expand(variable, .value = c("estimate", "moe")) %>%
mutate(
.name = paste0(variable, ifelse(.value == "moe", "_moe", ""))
)
#> # A tibble: 4 x 3
#> variable .value .name
#> <chr> <chr> <chr>
#> 1 income estimate income
#> 2 income moe income_moe
#> 3 rent estimate rent
#> 4 rent moe rent_moe
د دې مشخصاتو چمتو کول pivot_wider()
موږ ته هغه پایله راکوي چې موږ یې په لټه کې یو:
us_rent_income %>% pivot_wider(spec = spec)
#> # A tibble: 52 x 6
#> GEOID NAME income income_moe rent rent_moe
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 01 Alabama 24476 136 747 3
#> 2 02 Alaska 32940 508 1200 13
#> 3 04 Arizona 27517 148 972 4
#> 4 05 Arkansas 23789 165 709 5
#> 5 06 California 29454 109 1358 3
#> 6 08 Colorado 32401 109 1125 5
#> 7 09 Connecticut 35326 195 1123 5
#> 8 10 Delaware 31560 247 1076 10
#> 9 11 District of Columbia 43198 681 1424 17
#> 10 12 Florida 25952 70 1077 3
#> # … with 42 more rows
نړیوال بانک
ځینې وختونه په مطلوب شکل کې د ډیټا سیټ راوړل څو مرحلو ته اړتیا لري.
ډیټاسیټ نړیوال_بانک_پاپ د 2000 او 2018 ترمنځ د هر هیواد نفوس په اړه د نړیوال بانک معلومات لري.
#> # A tibble: 1,056 x 20
#> country indicator `2000` `2001` `2002` `2003` `2004` `2005` `2006`
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 ABW SP.URB.T… 4.24e4 4.30e4 4.37e4 4.42e4 4.47e+4 4.49e+4 4.49e+4
#> 2 ABW SP.URB.G… 1.18e0 1.41e0 1.43e0 1.31e0 9.51e-1 4.91e-1 -1.78e-2
#> 3 ABW SP.POP.T… 9.09e4 9.29e4 9.50e4 9.70e4 9.87e+4 1.00e+5 1.01e+5
#> 4 ABW SP.POP.G… 2.06e0 2.23e0 2.23e0 2.11e0 1.76e+0 1.30e+0 7.98e-1
#> 5 AFG SP.URB.T… 4.44e6 4.65e6 4.89e6 5.16e6 5.43e+6 5.69e+6 5.93e+6
#> 6 AFG SP.URB.G… 3.91e0 4.66e0 5.13e0 5.23e0 5.12e+0 4.77e+0 4.12e+0
#> 7 AFG SP.POP.T… 2.01e7 2.10e7 2.20e7 2.31e7 2.41e+7 2.51e+7 2.59e+7
#> 8 AFG SP.POP.G… 3.49e0 4.25e0 4.72e0 4.82e0 4.47e+0 3.87e+0 3.23e+0
#> 9 AGO SP.URB.T… 8.23e6 8.71e6 9.22e6 9.77e6 1.03e+7 1.09e+7 1.15e+7
#> 10 AGO SP.URB.G… 5.44e0 5.59e0 5.70e0 5.76e0 5.75e+0 5.69e+0 4.92e+0
#> # … with 1,046 more rows, and 11 more variables: `2007` <dbl>,
#> # `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>, `2012` <dbl>,
#> # `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>
زموږ هدف دا دی چې د هر متغیر سره په خپل کالم کې د پاک ډیټا سیټ رامینځته کړئ. دا روښانه نده چې کوم ګامونو ته اړتیا ده، مګر موږ به د خورا څرګندې ستونزې سره پیل وکړو: کال په ډیری کالمونو کې خپور شوی.
د دې د حل کولو لپاره تاسو اړتیا لرئ فنکشن وکاروئ pivot_longer()
.
pop2 <- world_bank_pop %>%
pivot_longer(`2000`:`2017`, names_to = "year")
#> # A tibble: 19,008 x 4
#> country indicator year value
#> <chr> <chr> <chr> <dbl>
#> 1 ABW SP.URB.TOTL 2000 42444
#> 2 ABW SP.URB.TOTL 2001 43048
#> 3 ABW SP.URB.TOTL 2002 43670
#> 4 ABW SP.URB.TOTL 2003 44246
#> 5 ABW SP.URB.TOTL 2004 44669
#> 6 ABW SP.URB.TOTL 2005 44889
#> 7 ABW SP.URB.TOTL 2006 44881
#> 8 ABW SP.URB.TOTL 2007 44686
#> 9 ABW SP.URB.TOTL 2008 44375
#> 10 ABW SP.URB.TOTL 2009 44052
#> # … with 18,998 more rows
بل ګام دا دی چې د شاخص متغیر وګورئ.
pop2 %>% count(indicator)
#> # A tibble: 4 x 2
#> indicator n
#> <chr> <int>
#> 1 SP.POP.GROW 4752
#> 2 SP.POP.TOTL 4752
#> 3 SP.URB.GROW 4752
#> 4 SP.URB.TOTL 4752
چیرته چې SP.POP.GROW د نفوس وده ده، SP.POP.TOTL ټول نفوس، او SP.URB. * ورته شی، مګر یوازې د ښاري سیمو لپاره. راځئ چې دا ارزښتونه په دوه متغیرونو وویشو: ساحه - ساحه (ټول یا ښاري) او یو متغیر چې حقیقي معلومات لري ( نفوس یا وده):
pop3 <- pop2 %>%
separate(indicator, c(NA, "area", "variable"))
#> # A tibble: 19,008 x 5
#> country area variable year value
#> <chr> <chr> <chr> <chr> <dbl>
#> 1 ABW URB TOTL 2000 42444
#> 2 ABW URB TOTL 2001 43048
#> 3 ABW URB TOTL 2002 43670
#> 4 ABW URB TOTL 2003 44246
#> 5 ABW URB TOTL 2004 44669
#> 6 ABW URB TOTL 2005 44889
#> 7 ABW URB TOTL 2006 44881
#> 8 ABW URB TOTL 2007 44686
#> 9 ABW URB TOTL 2008 44375
#> 10 ABW URB TOTL 2009 44052
#> # … with 18,998 more rows
اوس ټول هغه څه چې موږ یې باید وکړو متغیر په دوه کالمونو ویشو:
pop3 %>%
pivot_wider(names_from = variable, values_from = value)
#> # A tibble: 9,504 x 5
#> country area year TOTL GROW
#> <chr> <chr> <chr> <dbl> <dbl>
#> 1 ABW URB 2000 42444 1.18
#> 2 ABW URB 2001 43048 1.41
#> 3 ABW URB 2002 43670 1.43
#> 4 ABW URB 2003 44246 1.31
#> 5 ABW URB 2004 44669 0.951
#> 6 ABW URB 2005 44889 0.491
#> 7 ABW URB 2006 44881 -0.0178
#> 8 ABW URB 2007 44686 -0.435
#> 9 ABW URB 2008 44375 -0.698
#> 10 ABW URB 2009 44052 -0.731
#> # … with 9,494 more rows
د اړیکو لیست
یو وروستی مثال، تصور وکړئ چې تاسو د اړیکو لیست لرئ چې تاسو د ویب پاڼې څخه کاپي او پیسټ کړی:
contacts <- tribble(
~field, ~value,
"name", "Jiena McLellan",
"company", "Toyota",
"name", "John Smith",
"company", "google",
"email", "[email protected]",
"name", "Huxley Ratcliffe"
)
د دې لیست جدول کول خورا ستونزمن دي ځکه چې هیڅ متغیر شتون نلري چې دا معلومه کړي چې کوم ډیټا د کومې اړیکې سره تړاو لري. موږ کولی شو دا په یادولو سره حل کړو چې د هرې نوې اړیکې ډیټا د "نوم" سره پیل کیږي ، نو موږ کولی شو یو ځانګړی پیژندونکی رامینځته کړو او هرکله چې د ساحې کالم "نوم" ارزښت ولري یو له مخې یې زیات کړو:
contacts <- contacts %>%
mutate(
person_id = cumsum(field == "name")
)
contacts
#> # A tibble: 6 x 3
#> field value person_id
#> <chr> <chr> <int>
#> 1 name Jiena McLellan 1
#> 2 company Toyota 1
#> 3 name John Smith 2
#> 4 company google 2
#> 5 email [email protected] 2
#> 6 name Huxley Ratcliffe 3
اوس چې موږ د هرې اړیکې لپاره یو ځانګړی ID لرو، موږ کولی شو ساحه او ارزښت په کالمونو بدل کړو:
contacts %>%
pivot_wider(names_from = field, values_from = value)
#> # A tibble: 3 x 4
#> person_id name company email
#> <int> <chr> <chr> <chr>
#> 1 1 Jiena McLellan Toyota <NA>
#> 2 2 John Smith google [email protected]
#> 3 3 Huxley Ratcliffe <NA> <NA>
پایلې
زما شخصي نظر دا دی چې نوی مفهوم منظم په ریښتیا ډیر هوښیار، او د میراث دندو ته په فعالیت کې د پام وړ لوړ spread()
и gather()
. زه امید لرم چې دا مقاله تاسو سره معامله کې مرسته کړې pivot_longer()
и pivot_wider()
.
سرچینه: www.habr.com