ProHoster > وبلاگ > اداره > بسته R tidyr و توابع جدید آن pivot_longer و pivot_wider
بسته R tidyr و توابع جدید آن pivot_longer و pivot_wider
بسته بندی مرتب در هسته یکی از محبوب ترین کتابخانه ها در زبان R گنجانده شده است - مرتب.
هدف اصلی بسته آوردن داده ها به شکل دقیق است.
در حال حاضر در Habré موجود است انتشار به این بسته اختصاص داده شده است، اما تاریخ آن به سال 2015 باز می گردد. و من می خواهم در مورد جدیدترین تغییراتی که چند روز پیش توسط نویسنده آن، هدلی ویکهام اعلام شد، به شما بگویم.
S.J.K.: آیا collect() و spread() منسوخ خواهند شد؟
هدلی ویکهام: تا حدودی ما دیگر استفاده از این توابع و رفع ایرادات آنها را توصیه نمی کنیم، اما آنها در وضعیت فعلی خود در بسته وجود خواهند داشت.
مقدار
اگر به تجزیه و تحلیل داده ها علاقه دارید، ممکن است به من علاقه مند شوید تلگراف и یوتیوب کانال ها بیشتر مطالب به زبان R اختصاص داده شده است.
هدف مرتب - به شما کمک می کند تا داده ها را به یک فرم به اصطلاح منظم بیاورید. داده های منظم داده هایی هستند که در آن:
هر متغیر در یک ستون است.
هر مشاهده یک رشته است.
هر مقدار یک سلول است.
هنگام انجام تجزیه و تحلیل، کار با داده هایی که در داده های مرتب ارائه می شوند بسیار ساده تر و راحت تر است.
عملکردهای اصلی موجود در بسته tidyr
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 در دسترس هستند.
انتقال به ویژگی های جدید
در واقع، انتقال اسکریپت های قدیمی به کار با توابع جدید دشوار نیست؛ برای درک بهتر، من از مستندات توابع قدیمی مثالی می زنم و نشان می دهم که چگونه همان عملیات با استفاده از توابع جدید انجام می شود. 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()، در جدول اصلی سهام هیچ ستونی در آرگومان ها فهرست نشده است نامهای_به и مقادیر_به نام آنها باید در گیومه باشد.
جدولی که به شما کمک می کند تا به راحتی بفهمید که چگونه به کار با یک مفهوم جدید تغییر دهید مرتب.
یادداشت از نویسنده
تمام متن زیر تطبیقی است، حتی می توانم بگویم ترجمه رایگان عکس ها از وب سایت رسمی کتابخانه tidyverse.
یک مثال ساده از تبدیل داده ها از فرمت گسترده به طولانی
pivot_longer () - با کاهش تعداد ستون ها و افزایش تعداد ردیف ها، مجموعه داده ها را طولانی تر می کند.
برای اجرای نمونه های ارائه شده در مقاله، ابتدا باید بسته های لازم را به هم وصل کنید:
library(tidyr)
library(dplyr)
library(readr)
فرض کنید جدولی با نتایج یک نظرسنجی داریم که (از جمله موارد دیگر) از مردم در مورد مذهب و درآمد سالانه آنها سؤال کرده است:
این جدول حاوی دادههای مذهب پاسخدهندگان در ردیفها است و سطوح درآمد در نام ستونها پراکنده است. تعداد پاسخ دهندگان از هر دسته در مقادیر سلولی در تقاطع دین و سطح درآمد ذخیره می شود. برای آوردن جدول به یک قالب منظم و صحیح، کافی است از آن استفاده کنید pivot_longer():
استدلال اول یقه، توضیح می دهد که کدام ستون ها باید ادغام شوند. در این مورد، تمام ستون ها به جز زمان.
بحث و جدل نامهای_به نام متغیری را می دهد که از نام ستون هایی که به هم پیوسته ایم ایجاد می شود.
مقادیر_به نام متغیری را می دهد که از داده های ذخیره شده در مقادیر سلول های ستون های ادغام شده ایجاد می شود.
مشخصات
این یک قابلیت جدید از بسته است مرتب، که قبلاً هنگام کار با توابع قدیمی در دسترس نبود.
مشخصات یک قاب داده است که هر ردیف آن مربوط به یک ستون در قاب تاریخ خروجی جدید و دو ستون ویژه است که با:
نام شامل نام ستون اصلی است.
.ارزش شامل نام ستونی است که حاوی مقادیر سلول است.
ستونهای باقیمانده مشخصات نشان میدهند که چگونه ستون جدید نام ستونهای فشردهشده را نمایش میدهد نام.
مشخصات فوق داده های ذخیره شده در نام ستون را توصیف می کند، با یک ردیف برای هر ستون و یک ستون برای هر متغیر، همراه با نام ستون، این تعریف ممکن است در حال حاضر گیج کننده به نظر برسد، اما پس از بررسی چند مثال بسیار زیاد خواهد شد. واضح تر
نکته مشخصه این است که شما می توانید ابرداده جدیدی را برای دیتافریم در حال تبدیل بازیابی، اصلاح و تعریف کنید.
برای کار با مشخصات هنگام تبدیل جدول از فرمت گسترده به طولانی، از تابع استفاده کنید pivot_longer_spec().
نحوه عملکرد این تابع به این صورت است که هر فریم تاریخی را می گیرد و ابرداده آن را به روشی که در بالا توضیح داده شد تولید می کند.
به عنوان مثال، بیایید مجموعه داده who ارائه شده با بسته را در نظر بگیریم مرتب. این مجموعه داده حاوی اطلاعات ارائه شده توسط سازمان بین المللی بهداشت در مورد بروز سل است.
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")
زمینه کشور, iso2, iso3 در حال حاضر متغیر هستند. وظیفه ما این است که ستون ها را با آن برگردانیم new_sp_m014 بر newrel_f65.
نام این ستون ها اطلاعات زیر را ذخیره می کند:
پیشوند new_ نشان می دهد که ستون حاوی داده هایی در مورد موارد جدید سل است، چارچوب تاریخ فعلی فقط حاوی اطلاعات مربوط به بیماری های جدید است، بنابراین این پیشوند در زمینه فعلی هیچ معنایی ندارد.
sp/rel/sp/ep روشی را برای تشخیص بیماری توضیح می دهد.
m/f جنسیت بیمار
014/1524/2535/3544/4554/65 محدوده سنی بیمار
ما می توانیم این ستون ها را با استفاده از تابع تقسیم کنیم extract()با استفاده از بیان منظم
در نهایت، برای اعمال مشخصاتی که ایجاد کردیم در قاب تاریخ اصلی که ما باید از یک استدلال استفاده کنیم تنظیمات در عمل 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() انجام این کار بسیار دشوار خواهد بود.
مثال زیر از آن گرفته شده است عکس ها به بسته جدول داده.
قاب تاریخ ایجاد شده حاوی داده هایی در مورد فرزندان یک خانواده در هر خط است. خانواده ها ممکن است یک یا دو فرزند داشته باشند. برای هر کودک، اطلاعات مربوط به تاریخ تولد و جنسیت ارائه میشود و دادههای هر کودک در ستونهای جداگانه قرار میگیرد؛ وظیفه ما این است که این دادهها را به فرمت صحیح برای تجزیه و تحلیل برسانیم.
لطفاً توجه داشته باشید که ما دو متغیر با اطلاعات مربوط به هر کودک داریم: جنسیت و تاریخ تولد آنها (ستون هایی با پیشوند DOP حاوی تاریخ تولد، ستون هایی با پیشوند جنس حاوی جنسیت کودک باشد). نتیجه مورد انتظار این است که آنها باید در ستون های جداگانه ظاهر شوند. ما می توانیم این کار را با ایجاد مشخصاتی که در آن ستون است انجام دهیم .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)) - تبدیل مقادیر فیلد کودک از متن تا نوع داده عددی
حالا می توانیم مشخصات به دست آمده را روی دیتافریم اصلی اعمال کنیم و جدول را به فرم دلخواه برسانیم.
ما از استدلال استفاده می کنیم 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)
#> # 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 پر می شود.
با این حال، در این مورد می دانیم که عدم وجود رکورد به معنای دیده نشدن ماهی است، بنابراین می توانیم از استدلال استفاده کنیم values_fill در عمل pivot_wider() و این مقادیر از دست رفته را با صفر پر کنید:
تصور کنید جدولی داریم که شامل ترکیبی از محصول، کشور و سال است. برای ایجاد یک فریم تاریخ تست، می توانید کد زیر را اجرا کنید:
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
وظیفه ما این است که چارچوب داده را گسترش دهیم تا یک ستون حاوی داده برای هر ترکیب محصول و کشور باشد. برای انجام این کار، فقط در استدلال عبور کنید نامهای_از بردار حاوی نام فیلدهایی که باید ادغام شوند.
همچنین می توانید مشخصات را برای یک تابع اعمال کنید pivot_wider(). اما زمانی که به pivot_wider() مشخصات، تبدیل مخالف را انجام می دهد pivot_longer(): ستون های مشخص شده در نام، با استفاده از مقادیر از .ارزش و ستون های دیگر
برای این مجموعه داده، اگر میخواهید هر کشور و ترکیب محصول ممکن ستون مخصوص به خود را داشته باشد، میتوانید یک مشخصات سفارشی ایجاد کنید، نه فقط موارد موجود در دادهها:
#> # 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
چندین نمونه پیشرفته از کار با مفهوم جدید tidyr
پاک کردن داده ها با استفاده از مجموعه داده های درآمد و اجاره سرشماری ایالات متحده به عنوان مثال.
مجموعه داده ها ما_اجاره_درآمد حاوی اطلاعات درآمد متوسط و اجاره برای هر ایالت در ایالات متحده برای سال 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
به شکلی که داده ها در مجموعه داده ذخیره می شوند ما_اجاره_درآمد کار با آنها بسیار ناخوشایند است، بنابراین ما می خواهیم یک مجموعه داده با ستون ایجاد کنیم: اجاره, rent_moe, بیا, درآمد_موه. راه های زیادی برای ایجاد این مشخصات وجود دارد، اما نکته اصلی این است که ما باید هر ترکیبی از مقادیر متغیر و تخمین/پولو سپس نام ستون را تولید کنید.
گاهی اوقات آوردن یک مجموعه داده به فرم مورد نظر به چندین مرحله نیاز دارد.
مجموعه داده بانک_جهانی_پاپ شامل داده های بانک جهانی در مورد جمعیت هر کشور بین سال های 2000 تا 2018 است.
هدف ما ایجاد یک مجموعه داده منظم با هر متغیر در ستون خودش است. دقیقاً مشخص نیست چه مراحلی لازم است، اما ما با واضحترین مشکل شروع میکنیم: سال در چندین ستون پخش میشود.
برای رفع این مشکل باید از تابع استفاده کنید pivot_longer().
مرحله بعدی این است که به متغیر نشانگر نگاه کنید. 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 است. * همان چیزی است، اما فقط برای مناطق شهری. بیایید این مقادیر را به دو متغیر تقسیم کنیم: مساحت - مساحت (کل یا شهری) و یک متغیر حاوی داده های واقعی (جمعیت یا رشد):
جدول بندی این لیست بسیار دشوار است زیرا هیچ متغیری وجود ندارد که مشخص کند کدام داده متعلق به کدام مخاطب است. ما میتوانیم این مشکل را با توجه به اینکه دادههای هر مخاطب جدید با "name" شروع میشود برطرف کنیم، بنابراین میتوانیم یک شناسه منحصربهفرد ایجاد کنیم و هر بار که ستون فیلد حاوی مقدار "name" باشد، آن را یک عدد افزایش دهیم:
#> # 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
اکنون که برای هر مخاطب یک شناسه منحصر به فرد داریم، میتوانیم فیلد و مقدار را به ستون تبدیل کنیم:
#> # 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().