تحلیلگران داده معمولا در موقعیتی قرار میگیرند که لازم است یک تابع را روی چند ستون اعمال کنند. مثلا لازم است میانگین چند ستون را به صورت همزمان محاسبه کنند. این کار برای یک یا چند ستون ساده است. اما وقتی تعداد ستونها زیاد باشد یا اگر بیشتر از یک تابع را بخواهید اعمال کنید ممکن است زمان بر و طاقت فرسا باشد. اینکار در 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 نیز استفاده کنید. این کار باعث کوتاهتر و سادهتر شدن راه حلها میشود.