ጥቅል tidyr በ R ቋንቋ ውስጥ ካሉት በጣም ታዋቂ ቤተ-መጻሕፍት ዋና ክፍል ውስጥ ተካትቷል - ሥርዓታማ.
የጥቅሉ ዋና ዓላማ መረጃውን ወደ ትክክለኛ ቅጽ ማምጣት ነው።
ቀድሞውንም ሀበሬ ላይ
ኤስመሰብሰብ () እና መስፋፋት () ይቋረጣል?
Hadley Wickham: በተወሰነ መጠን. ከአሁን በኋላ እነዚህን ተግባራት እንዲጠቀሙ አንመክርም እና በውስጣቸው ያሉ ስህተቶችን አስተካክል, ነገር ግን አሁን ባለው ሁኔታ በጥቅሉ ውስጥ መኖራቸውን ይቀጥላሉ.
ይዘቶች
የውሂብ ትንተና ላይ ፍላጎት ካሎት የእኔን ሊፈልጉ ይችላሉ
TidyData ጽንሰ-ሐሳብ በቲዲር ጥቅል ውስጥ የተካተቱ ዋና ተግባራት መረጃን ከሰፊ ወደ ረጅም ቅርጸት ለመለወጥ አዲስ ጽንሰ-ሀሳብ እና በተቃራኒው በጣም የአሁኑን የ tidyr 0.8.3.9000 ስሪት በመጫን ላይ ወደ አዲስ ባህሪያት ሽግግር መረጃን ከሰፊ ወደ ረጅም ቅርጸት የመቀየር ቀላል ምሳሌ አስማሚዎች በርካታ እሴቶችን (. እሴት) በመጠቀም መግለጫ የቀን ፍሬሞችን ከረዥም ወደ ሰፊ ቅርጸት በመቀየር ላይ ከአዲሱ የቲዲር ጽንሰ-ሀሳብ ጋር አብሮ ለመስራት ብዙ የላቁ ምሳሌዎች መደምደሚያ
TidyData ጽንሰ-ሐሳብ
ግብ tidyr - ውሂቡን ንፁህ ተብሎ ወደሚጠራው ቅጽ ለማምጣት ያግዝዎታል። ንፁህ ውሂብ የተገኘበት ውሂብ ነው፡-
- እያንዳንዱ ተለዋዋጭ በአንድ አምድ ውስጥ ነው.
- እያንዳንዱ ምልከታ ሕብረቁምፊ ነው።
- እያንዳንዱ እሴት ሕዋስ ነው።
ትንታኔ በሚሰጥበት ጊዜ በንፁህ መረጃ ውስጥ ከሚቀርበው መረጃ ጋር ለመስራት በጣም ቀላል እና የበለጠ ምቹ ነው።
በቲዲር ጥቅል ውስጥ የተካተቱ ዋና ተግባራት
tidyr ሰንጠረዦችን ለመለወጥ የተነደፉ የተግባሮች ስብስብ ይዟል፡-
fill()
- የጎደሉትን ዋጋዎች በአምድ ውስጥ ከቀደምት ዋጋዎች ጋር መሙላት;separate()
- መለያየትን በመጠቀም አንዱን መስክ ወደ ብዙ ይከፍላል;unite()
- በርካታ መስኮችን ወደ አንድ የማጣመር ተግባርን ያከናውናል ፣ የተግባር ተገላቢጦሽseparate()
;pivot_longer()
- መረጃን ከሰፊ ቅርጸት ወደ ረጅም ቅርጸት የሚቀይር ተግባር;pivot_wider()
- መረጃን ከረዥም ቅርጸት ወደ ሰፊ ቅርጸት የሚቀይር ተግባር። በተግባሩ የሚሠራው የተገላቢጦሽ አሠራርpivot_longer()
.gather()
ጊዜው ያለፈበት - መረጃን ከሰፊ ቅርጸት ወደ ረጅም ቅርጸት የሚቀይር ተግባር;spread()
ጊዜው ያለፈበት - መረጃን ከረዥም ቅርጸት ወደ ሰፊ ቅርጸት የሚቀይር ተግባር። በተግባሩ የሚሠራው የተገላቢጦሽ አሠራርgather()
.
መረጃን ከሰፊ ወደ ረጅም ቅርጸት ለመለወጥ አዲስ ጽንሰ-ሀሳብ እና በተቃራኒው
ከዚህ በፊት ተግባራት ለዚህ አይነት ለውጥ ጥቅም ላይ ውለው ነበር gather()
и spread()
. እነዚህ ተግባራት በነበሩባቸው ዓመታት ውስጥ የጥቅሉን ደራሲን ጨምሮ ለአብዛኛዎቹ ተጠቃሚዎች የእነዚህ ተግባራት ስሞች እና ክርክሮች በጣም ግልፅ እንዳልሆኑ እና እነሱን ለማግኘት እና ከእነዚህ ተግባራት ውስጥ የትኛውን እንደሚለውጥ ለመረዳት ችግር እንደፈጠረ ግልጽ ሆነ ። የቀን ክፈፍ ከሰፊ እስከ ረጅም ቅርጸት እና በተቃራኒው።
በዚህ ረገድ በ tidyr የቀን ፍሬሞችን ለመለወጥ የተነደፉ ሁለት አዲስ፣ ጠቃሚ ተግባራት ተጨምረዋል።
Овые функции pivot_longer()
и pivot_wider()
በጥቅሉ ውስጥ ባሉ አንዳንድ ባህሪያት ተመስጦ ነበር። cdataበጆን ተራራ እና በኒና ዙመል የተፈጠረ።
በጣም የአሁኑን የ tidyr 0.8.3.9000 ስሪት በመጫን ላይ
አዲሱን ፣ በጣም የአሁኑን የጥቅል ስሪት ለመጫን tidyr 0.8.3.9000አዲስ ባህሪያት በሚገኙበት ቦታ, የሚከተለውን ኮድ ይጠቀሙ.
devtools::install_github("tidyverse/tidyr")
በሚጽፉበት ጊዜ እነዚህ ተግባራት በ GitHub ላይ ባለው የጥቅል ዲቪ ስሪት ውስጥ ብቻ ይገኛሉ።
ወደ አዲስ ባህሪያት ሽግግር
እንደ እውነቱ ከሆነ የቆዩ ስክሪፕቶችን ከአዳዲስ ተግባራት ጋር ወደ ሥራ ለማስተላለፍ አስቸጋሪ አይደለም ፣ ለተሻለ ግንዛቤ ፣ ከአሮጌ ተግባራት ሰነዶች ምሳሌ ወስጄ አዳዲሶችን በመጠቀም ተመሳሳይ ክዋኔዎች እንዴት እንደሚከናወኑ ያሳያል ። 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()
, በዋናው ሠንጠረዥ ውስጥ አክሲዮኖች በክርክር ውስጥ የተዘረዘሩ ዓምዶች የሉም ስሞች_ለ и እሴቶች_ለ ስማቸው በጥቅስ ምልክቶች ውስጥ መሆን አለበት.
ከአዲስ ፅንሰ-ሀሳብ ጋር ወደ ሥራ እንዴት መቀየር እንደሚችሉ በቀላሉ የሚረዳዎ ሠንጠረዥ tidyr.
ማስታወሻ ከጸሐፊው
ከዚህ በታች ያለው ጽሑፍ ሁሉ የሚለምደዉ ነው፣ ነፃ ትርጉም እንኳን እላለሁ።
ቪንቴቶች ከኦፊሴላዊው የቲዲቨርስ ቤተመፃህፍት ድህረ ገጽ።
መረጃን ከሰፊ ወደ ረጅም ቅርጸት የመቀየር ቀላል ምሳሌ
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()
- የመጀመሪያ ክርክር ኮላሎች, የትኞቹ ዓምዶች መቀላቀል እንዳለባቸው ይገልጻል. በዚህ አጋጣሚ, በስተቀር ሁሉም አምዶች ጊዜ.
- ክርክር ስሞች_ለ ከተጣመርንባቸው ዓምዶች ስም የሚፈጠረውን ተለዋዋጭ ስም ይሰጣል።
- እሴቶች_ለ በተዋሃዱ አምዶች ሕዋሶች ውስጥ ከተከማቹ መረጃዎች የሚፈጠረውን ተለዋዋጭ ስም ይሰጣል።
አስማሚዎች
ይህ የጥቅል አዲስ ተግባር ነው። tidyr, ቀደም ሲል ከቆዩ ተግባራት ጋር ሲሰራ የማይገኝ ነበር.
ዝርዝር መግለጫ የውሂብ ፍሬም ነው፣ እያንዳንዱ ረድፍ በአዲሱ የውጤት ቀን ፍሬም ውስጥ ካለው አንድ አምድ ጋር ይዛመዳል፣ እና ሁለት ልዩ አምዶች የሚጀምሩት፡-
- .name ዋናውን የአምድ ስም ይዟል።
- .እሴት የሕዋስ እሴቶችን የሚያካትት የአምዱ ስም ይዟል።
የቀሩት የዝርዝሩ አምዶች አዲሱ አምድ የተጨመቁትን አምዶች ስም እንዴት እንደሚያሳይ ያንፀባርቃሉ .name.
መግለጫው በአምድ ስም የተከማቸውን ሜታዳታ ይገልፃል፣ ለእያንዳንዱ አምድ አንድ ረድፍ እና ለእያንዳንዱ ተለዋዋጭ አንድ አምድ፣ ከአምድ ስም ጋር ተደምሮ፣ ይህ ፍቺ በአሁኑ ጊዜ ግራ የሚያጋባ ሊመስል ይችላል፣ ነገር ግን ጥቂት ምሳሌዎችን ከተመለከትን በኋላ ብዙ ይሆናል። የበለጠ ግልጽ
የመግለጫው ነጥቡ እየተለወጠ ላለው የውሂብ ፍሬም አዲስ ሜታዳታን ማምጣት፣ ማሻሻል እና መግለጽ ይችላሉ።
ጠረጴዛን ከሰፊ ቅርጸት ወደ ረጅም ቅርጸት ሲቀይሩ ከዝርዝሮች ጋር ለመስራት, ተግባሩን ይጠቀሙ pivot_longer_spec()
.
ይህ ተግባር እንዴት እንደሚሰራ ማንኛውንም የቀን ፍሬም ወስዶ ዲበ ዳታውን ከላይ በተገለጸው መንገድ ማመንጨት ነው።
እንደ ምሳሌ ከጥቅሉ ጋር የቀረበውን የማን ዳታ ስብስብ እንውሰድ tidyr. ይህ የመረጃ ቋት በአለም አቀፍ የጤና ድርጅት የሳንባ ነቀርሳ በሽታ መከሰትን የሚመለከት መረጃ ይዟል።
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
መስኮች አገር, iso2, iso3 ቀድሞውኑ ተለዋዋጮች ናቸው። የእኛ ተግባር ዓምዶቹን መገልበጥ ነው። አዲስ_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
እባክዎ ዓምዱን ያስተውሉ .name ይህ የእኛ መረጃ ጠቋሚ ወደ የመጀመሪያው የውሂብ ስብስብ የአምድ ስሞች ስለሆነ ሳይለወጥ መቆየት አለበት።
ጾታ እና ዕድሜ (አምዶች ፆታ и ዕድሜ) ቋሚ እና የታወቁ እሴቶች አሏቸው፣ ስለዚህ እነዚህን አምዶች ወደ ምክንያቶች ለመቀየር ይመከራል፡-
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
አሁን ያደረግነው ነገር ሁሉ በሚከተለው መልኩ ሊገለጽ ይችላል፡
በርካታ እሴቶችን (. እሴት) በመጠቀም መግለጫ
ከላይ ባለው ምሳሌ, የዝርዝሩ አምድ .እሴት አንድ እሴት ብቻ ይዟል፣ በአብዛኛዎቹ ጉዳዮች ይህ ነው።
ነገር ግን አልፎ አልፎ በእሴቶች ውስጥ የተለያዩ የውሂብ ዓይነቶች ካላቸው ዓምዶች ውሂብ መሰብሰብ ሲያስፈልግ አንድ ሁኔታ ሊፈጠር ይችላል። የቆየ ተግባር በመጠቀም 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"))
- ዓምዱን ይከፋፍሉት .name, ይህም የመነሻ መስኮችን ስም የያዘ, የስር ምልክትን በመጠቀም እና የተገኙትን እሴቶች ወደ አምዶች ውስጥ በማስገባት. .እሴት и ልጅ.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()
ውስጥ የተገለጹት አምዶች .nameእሴቶችን በመጠቀም .እሴት እና ሌሎች አምዶች.
ለእዚህ የውሂብ ስብስብ፣ በመረጃው ውስጥ የሚገኙትን ብቻ ሳይሆን እያንዳንዱ ሀገር እና የምርት ጥምረት የራሱ አምድ እንዲኖረው ከፈለጉ ብጁ ዝርዝር ማመንጨት ይችላሉ።
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
አሁን ለእያንዳንዱ እውቂያ ልዩ መታወቂያ ስላለን መስኩን እና እሴቱን ወደ አምዶች መለወጥ እንችላለን፡-
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>
መደምደሚያ
የእኔ የግል አስተያየት አዲሱ ጽንሰ-ሐሳብ ነው tidyr በእውነቱ የበለጠ ሊታወቅ የሚችል እና በተግባራዊነት ከውርስ ተግባራት የላቀ spread()
и gather()
. ይህ ጽሑፍ እርስዎን ለመቋቋም እንደረዳዎት ተስፋ አደርጋለሁ pivot_longer()
и pivot_wider()
.
ምንጭ: hab.com