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