چطور می‌توان یک تابع را روی چند ستون اعمال کرد؟

across_cover

تحلیل‌گران داده معمولا در موقعیتی قرار می‌گیرند که لازم است یک تابع را روی چند ستون اعمال کنند. مثلا لازم است میانگین چند ستون را به صورت همزمان محاسبه کنند. این کار برای یک یا چند ستون ساده است. اما وقتی تعداد ستون‌ها زیاد باشد یا اگر بیشتر از یک تابع را بخواهید اعمال کنید ممکن است زمان بر و طاقت فرسا باشد. این‌کار در R با استفاده از تابع across ساده است. داده‌های زیر را ببینید:

				
					iris
				
			
				
					.  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
				
			

می‌خواهیم میانگین ستون‌های Sepal.Length و Petal.Length را محاسبه کنیم. این دو مقدار طول کاسبرگ‌ها و گلبرگ‌های گل زنبق هستند!

می‌توانید از تابع summarise برای بدست آوردن میانگین استفاده کنید:

				
					library(dplyr)
iris |>
  summarise(mean(Sepal.Length),
            mean(Petal.Length))
				
			
				
					.  mean(Sepal.Length) mean(Petal.Length)
1           5.843333              3.758
				
			

با استفاده از تابع across میتوانید این کد را به صورت زیر بنویسید:

				
					iris |>
  summarise(across(c(Sepal.Length, Petal.Length),
                   .fns = mean))
				
			
				
					.  Sepal.Length Petal.Length
1     5.843333        3.758
				
			

وجه تمایز تابع across در آن است که شما می‌توانید از توابع دیگر کتابخانه dplyr در آن نیز استفاده کنید. مثلا در مثالی که در دست داریم می‌توانیم تنها ستون‌هایی که با عبارت length خاتمه پیدا می‌کنند را انتخاب کنیم و نتیجه مشابهی را بدست بیاوریم. 

				
					iris |>
  summarise(across(ends_with("Length"), 
                   .fns = mean))
				
			
				
					.  Sepal.Length Petal.Length
1     5.843333        3.758
				
			

همچنین می‌توانید محدوده مشخصی از داده‌ها را برای اعمال تابع دلخواه خود مشخص کنید. فرض کنید می‌خواهید روی تمام ستون‌های مجموعه داده‌های iris میانگین را محاسبه کنید:

				
					iris |>
  summarise(across(Sepal.Length:Petal.Width, 
                   .fns = mean))
				
			
				
					  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.843333    3.057333        3.758    1.199333
				
			

حتی برای ساده‌تر شدن می‌توانید تنها ستون‌هایی که خاصیتی مشخص دارند را انتخاب کنید. در مثالی که در دست داریم می‌توانیم تنها ستون‌هایی که عددی هستند را برای محاسبه میانگین استفاده کنیم.

				
					iris |>
  summarise(across(where(is.numeric), 
                   .fns = mean))
				
			
				
					.  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.843333    3.057333        3.758    1.199333
				
			

قدرت تابع across زمانی بیشتر مشخص می‌شود که شما بخواهید بیشتر از یک تابع را روی دسته‌ای از ستون‌ها اعمال کنید. با استفاده از خاصیت لیست‌ این کار ساده است. در مثالی که در دست داریم می‌خواهیم علاوه بر میانگین، انحراف معیار را نیز برای طول گلبرگ و کاسبرگ را محاسبه کنیم.

				
					iris |>
  summarise(across(ends_with("Length"),
                   .fns = list(mean = mean, sd = sd)))
				
			
				
					.  Sepal.Length_mean Sepal.Length_sd Petal.Length_mean Petal.Length_sd
1          5.843333       0.8280661             3.758        1.765298
				
			

از تابع across می‌توانید در دیگر توابع کتابخانه dplyr مانند mutate نیز استفاده کنید. این کار باعث کوتاه‌تر و ساده‌تر شدن راه حل‌ها می‌شود. 

دیدگاه‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors