R Select(), Filter(), Arrange(), Örnekle Boru Hattı
⚡ Akıllı Özet
R'da `Select`, `Filter` ve `Arrange`, bir veri çerçevesini ihtiyacınız olan sütunlara, satırlara ve sıraya indirgeyen üç `dplyr` fiilidir. Bu kılavuz, 205 satırlık bir seyahat süreleri veri kümesi üzerinde bu fiilleri `pipe` operatörüyle zincirleme olarak kullanmayı göstermektedir.

R'de dplyr nedir?
dplyr Tidyverse'ün veri işleme paketidir. Temel kümenin köşeli parantez gösteriminin yerini alır. R Her biri gerçekleştirdiği eyleme göre adlandırılmış ve her biri veri çerçevesini ilk argüman olarak alan az sayıda fiilden oluşan bir yapı. Bu tutarlı yapı, fiillerin birbirine zincirlenmesine olanak tanır.
| Fiil | Üzerinde davranır | Ne yapar |
|---|---|---|
| Seçme() | Sütunlar | Değişkenleri korur veya siler. |
| Filtre () | satırlar | Bir koşula uyan satırları saklar. |
| düzenlemek() | satırlar | Satırları bir veya daha fazla sütuna göre yeniden sıralar. |
| mutasyona uğrat() | Sütunlar | Bir değişken oluşturur veya değiştirir. |
| özetle() | Masanın tamamı | Birden fazla satırı tek bir istatistiğe dönüştürür. |
| grup_ölçümü() | Masanın tamamı | Verileri bölerek, sonraki fiillerin her grup için ayrı ayrı çalışmasını sağlar. |
Bu eğitimde ilk üç fiil ve boru fiili ele alınmaktadır. toplama fonksiyonu eğitimi group_by() ve summarise() fonksiyonlarını ayrıntılı olarak ele alıyor.
Bu eğitimde kullanılan veri seti
Dplyr adlı kütüphane, veri kümesi içinde gezinmek için değerli komutlar içerir. Bu eğitimde, Seyahat Süreleri veri kümesini kullanacaksınız. Veri kümesi, bir sürücünün ev ve iş yeri arasında yaptığı yolculukları kaydeder. Veri kümesinde on dört değişken bulunmaktadır, bunlar şunlardır:
- DayOfWeek: Sürücünün arabasını kullandığı haftanın gününü belirleyin
- Mesafe: Yolculuğun toplam mesafesi
- MaxSpeed: Yolculuğun maksimum hızı
- TotalTime: Yolculuğun dakika cinsinden uzunluğu
Veri seti 205 gözlem içermektedir ve yolculuklar şu tarihler arasında gerçekleşmiştir: Monday cumaya.
Her şeyden önce şunları yapmanız gerekir:
- veri kümesini yükle
- Verilerin yapısını kontrol edin.
dplyr kütüphanesinin kullanışlı fonksiyonlarından biri de glimpse() fonksiyonudur. Temel R str() fonksiyonuyla aynı işlevi görür ancak her değişken için türünü ve ilk birkaç değerini içeren bir satır yazdırır; bu da geniş bir veri kümesinde taramayı çok daha kolaylaştırır.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
Çıktı:
## Observations: 205 ## Variables: 14 ## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ## $ Date <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20... ## $ StartTime <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3... ## $ DayOfWeek <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,... ## $ GoingTo <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS... ## $ Distance <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37... ## $ MaxSpeed <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2... ## $ AvgSpeed <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,... ## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,... ## $ FuelEconomy <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89... ## $ TotalTime <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,... ## $ MovingTime <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,... ## $ Take407All <fctr> No, No, No, No, No, No, No, No, No, No, No, No... ## $ Comments <fctr> , , , , , , , , , , , , , , , Put snow tires o...
Yorumlar değişkenine daha yakından bakmak gerekiyor: ilk gözlemlerin hepsi boş.
sum(df$Comments =="")
Code açıklama
- sum(df$Comments == “”): df'nin Comments sütununda boş dizeye eşit olan gözlem sayısını hesaplar.
Çıktı:
## [1] 181
Veriler yüklendikten sonra, sütunları kırpan fiille başlayın.
Seçme()
Select() fiiliyle başlayacağız. Tüm değişkenlere mutlaka ihtiyacımız yok ve yalnızca ilgili bulduğunuz değişkenleri seçmek iyi bir uygulamadır.
Veri setinin neredeyse yüzde 181'ı olan 90 eksik gözlemimiz var. Bunları hariç tutmaya karar verirseniz analize devam edemezsiniz.
Diğer olasılık ise Comment değişkenini select() fiiliyle bırakmaktır.
Select() ile değişkenleri farklı şekillerde seçebiliriz. İlk argümanın veri kümesi olduğunu unutmayın.
- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset. - `select(df, A:C)`: Select all variables from A to C from df dataset. - `select(df, -C)`: Exclude C from the dataset from df dataset.
Comments değişkenini hariç tutmak için üçüncü yolu kullanabilirsiniz.
step_1_df <- select(df, -Comments) dim(df)
Çıktı:
## [1] 205 14
dim(step_1_df)
Çıktı:
## [1] 205 13
Orijinal veri kümesinde 14 özellik bulunurken step_1_df'de 13 özellik bulunur.
R'da select() Yardımcı Fonksiyonları
Bir veri kümesinde düzinelerce değişken olduğunda her sütuna isim vermek pratik olmaktan çıkar. dplyr, bunun yerine sütunları desene veya türe göre seçen yardımcı fonksiyonlarla birlikte gelir.
| Yardımcı | Seçilen sütunlar | Örnek E-posta |
|---|---|---|
| ile başlar() | Bir dizeyle başlayın | select(df, starts_with("Avg")) |
| ile biter() | Bir iple bitirin | select(df, ends_with("Time")) |
| içerir() | Herhangi bir yere bir dize ekleyin. | select(df, contains("Hız") |
| maçlar() | Düzenli ifadeyle eşleştirin | select(df, matches(“^Max|^Avg”)) |
| Neresi() | Bir tür testini karşılayın | select(df, where(is.numeric)) |
| her şey() | Henüz isimleri açıklanmadı. | select(df, TotalTime, everything()) |
# Keep only the timing columns df %>% select(ends_with("Time")) # Keep every numeric column df %>% select(where(is.numeric)) # Move TotalTime to the front, keep the rest in place df %>% select(TotalTime, everything())
`select()` fonksiyonuyla doğal olarak uyumlu iki fiil daha vardır. Bir sütunu silmeden yeniden adlandırmak için `rename(new_name = old_name)` ifadesini kullanın.ping Diğerleri için ise, sütunları hepsini listelemeden taşımak için relocate() işlevini kullanabilirsiniz.
Filtre ()
`filter()` fiili, bir koşulu sağlayan gözlemleri saklar. `filter()` tıpkı `select()` gibi çalışır; önce veri çerçevesini, ardından virgülle ayrılmış bir koşulu iletirsiniz:
filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition: Condition used to filter the data
Bir kriter
Her şeyden önce, bir faktör değişkeninin her seviyesindeki gözlem sayısını sayabilirsiniz.
table(step_1_df$GoingTo)
Code açıklama
- table(): Her seviye için gözlem sayısını sayar. Bir faktör veya karakter değişkeni bekler.
- tablo(adım_1_df$GoingTo): Her varış noktasına yapılan yolculuk sayısını sayın.
Çıktı:
## ## GSK Home ## 105 100
İşlev tablosu(), 105 yolculuğun GSK'ya ve 100 yolculuğun da Eve gideceğini gösterir.
Verileri, 105 gözlemli bir veri kümesini ve 100 gözlemli başka bir veri kümesini döndürecek şekilde filtreleyebiliriz.
# Select observations where GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
Çıktı:
## [1] 100 14
# Select observations where GoingTo == GSK (work) select_work <- filter(df, GoingTo == "GSK") dim(select_work)
Çıktı:
## [1] 105 14
Birden çok kriter
Bir veri setini birden fazla kritere göre filtreleyebiliriz. Örneğin, şunları yapabilirsiniz:tracHedefin Ev olduğu ve yolculuğun Çarşamba günü gerçekleştiği gözlemler.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
Çıktı:
## [1] 23 14
23 gözlem bu kriterle eşleşti.
Ortak filter() Koşulları ve OperaR'deki tors
filter() fonksiyonu, koşulun TRUE olarak değerlendirildiği her satırı saklar. NA olarak değerlendirilen satırlar ise silinir; bu davranış çoğu acemi için şaşırtıcıdır.
| Kullanım | anlam | Örnek E-posta |
|---|---|---|
| == | Eşittir | filtrele(df, GoingTo == “Home”) |
| != | Eşit değil | filtrele(df, DayOfWeek != “Monday") |
| & | VE, her ikisi de geçerli olmalıdır | filtrele(df, Mesafe > 50 ve Maksimum Hız > 130) |
| | | VEYA, her ikisi de geçerli olabilir | filtrele(df, DayOfWeek == “Monday” | Haftanın Günü == “Cuma”) |
| %içinde% | Vektördeki herhangi bir değerle eşleşir. | filtrele(df, Haftanın Günü %in% c(“Monday", "Cuma")) |
| arasında() | Sayısal bir aralığın içinde yer alır. | filtrele(df, arasında(Mesafe, 48, 52)) |
| is.na() | Eksik bir değer mi? | filtrele(df, is.na(FuelEconomy)) |
Üç alışkanlık, filter() fonksiyonundaki hataların çoğunu önler.
- Zincirleme VEYA yerine %in% kullanın. filtrele(df, Haftanın Günü %in% c(“Monday“Cuma” ifadesi, dikey bir çizgiyle birleştirilmiş iki == karşılaştırmasından daha kısadır ve yanlış yazılması çok daha zordur.
- Eksik değerleri asla == operatörüyle test etmeyin. x == NA ifadesi TRUE değil, NA döndürür, bu nedenle satır sessizce silinir. Bunun yerine is.na(x) kullanın.
- Virgüller "VE" anlamına gelir. filter(df, a, b) ifadesi filter(df, a & b) ifadesiyle aynıdır; bu nedenle bu eğitimin önceki bölümündeki örnek her iki şekilde de çalışır.
Boru Operadplyr'de tor
Bir veri kümesinin oluşturulması aşağıdakiler gibi birçok işlemi gerektirir:
- ithal
- birleştirme
- seçme
- süzme
- ve benzeri
Dplyr kütüphanesi, %>% adlı pratik bir operatörle birlikte gelir. boruBu, veri işleme süreçlerini daha temiz, hızlı ve hataya daha az yatkın hale getirir.
Bu operatör, ara adımları sabit diske kaydetmeden adımları gerçekleştiren bir koddur. Yukarıdaki örneğimize dönerseniz ilgilendiğiniz değişkenleri seçip filtreleyebilirsiniz. Üç adımımız var:
- 1. Adım: Verileri içe aktarın: GPS verilerini içe aktarın
- Adım 2: Verileri seçin: GoingTo ve DayOfWeek'i seçin
- 3. Adım: Verileri filtreleyin: Yalnızca Ana Sayfa ve Çarşamba günlerini döndür
Bunu yapmak için zor yolu kullanabiliriz:
# Step 1 step_1 <- read.csv(PATH) # Step 2 step_2 <- select(step_1, GoingTo, DayOfWeek) # Step 3 step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday") head(step_3)
Çıktı:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
Bu, birçok işlemi zincirleme olarak gerçekleştirmenin uygun bir yolu değil. Her ara sonuç ortamda kalır ve isimler kısa sürede anlamını yitirir.
Bunun yerine boru operatörü %>% kullanın. Veri çerçevesine başlangıçta bir kez isim verirsiniz ve her adım bu isimden yola çıkarak ilerler.
Boru hattının temel sözdizimi
New_df <- df %>% step 1 %>% step 2 %>% ... arguments - New_df: Name of the new data frame - df: Data frame used to compute the step - step: Instruction for each step - Note: the last instruction does not need a trailing `%>%`, because nothing follows it - Note: assigning the result to a new object is optional. Without it, the output prints in the console.
Yukarıda sıralanan adımları izleyerek ilk pipe'ınızı oluşturabilirsiniz.
# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline filter_home_wed <- #Step 1 read.csv(PATH) %>% #Step 2 select(GoingTo, DayOfWeek) %>% #Step 3 filter(GoingTo == "Home",DayOfWeek == "Wednesday") identical(step_3, filter_home_wed)
Çıktı:
## [1] TRUE
İki nesne özdeş olduğundan, boru hattı tek bir okunabilir ifadeyle tam olarak aynı sonucu üretti.
düzenlemek()
içinde önceki derssort() fonksiyonuyla değerleri nasıl sıralayacağınızı öğrenirsiniz. Dplyr kütüphanesinin sıralama işlevi vardır. Boru hattıyla bir cazibe gibi çalışıyor. Arrange() fiili, bir veya daha fazla satırı artan (varsayılan) veya azalan şekilde yeniden sıralayabilir.
- `arrange(A)`: Ascending sort of variable A - `arrange(A, B)`: Ascending sort of variable A and B - `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B
Mesafeyi varış noktasına göre sıralayabiliriz.
# Sort by destination and distance step_2_df <- step_1_df %>% arrange(GoingTo, Distance) head(step_2_df)
Çıktı:
## X Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed ## 1 193 7/25/2011 08:06 Monday GSK 48.32 121.2 63.4 ## 2 196 7/21/2011 07:59 Thursday GSK 48.35 129.3 81.5 ## 3 198 7/20/2011 08:24 Wednesday GSK 48.50 125.8 75.7 ## 4 189 7/27/2011 08:15 Wednesday GSK 48.82 124.5 70.4 ## 5 95 10/11/2011 08:25 Tuesday GSK 48.94 130.8 85.7 ## 6 171 8/10/2011 08:13 Wednesday GSK 48.98 124.8 72.8 ## AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All ## 1 78.4 8.45 45.7 37.0 No ## 2 89.0 8.28 35.6 32.6 Yes ## 3 87.3 7.89 38.5 33.3 Yes ## 4 77.8 8.45 41.6 37.6 No ## 5 93.2 7.81 34.3 31.5 Yes ## 6 78.8 8.54 40.4 37.3 No
R'deki dplyr Fiilleri: Hızlı Referans
Aşağıdaki tabloda bu eğitimde kullanılan her fiil, sözdizimi ve her bir çağrının ne döndürdüğü listelenmiştir:
| Fiil | Hedef | Code | açıklama |
|---|---|---|---|
| belirti | bir df'nin yapısını kontrol edin |
glimpse(df)
|
str() ile aynı amaca hizmet eder, okunması daha kolaydır. |
| Seçme() | Değişkenleri seç/hariç tut |
select(df, A, B ,C)
|
A, B ve C değişkenlerini seçin |
select(df, A:C)
|
A'dan C'ye tüm değişkenleri seçin | ||
select(df, -C)
|
C'yi hariç tut | ||
| Filtre () | Bir veya daha fazla koşula uyan satırları saklayın. |
filter(df, condition1)
|
Tek koşul |
filter(df, condition1 & condition2)
|
VE ile birleştirilmiş iki koşul | ||
| düzenlemek() | Veri kümesini bir veya daha fazla değişkenle sıralayın |
arrange(A)
|
A değişkeninin artan türü |
arrange(A, B)
|
A ve B değişkenlerinin artan türü | ||
arrange(desc(A), B)
|
A değişkeninin azalan türü ve B değişkeninin artan türü | ||
| %>% | Her adım arasında bir ardışık düzen oluşturun |
step 1 %>% step 2 %>% step 3 |
