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.

  • ???? Sütun Seçimi: `select(df, A, B)` adlandırılmış sütunları korur, `select(df, A:C)` bir aralığı korur ve `select(df, -C)` birini siler.
  • 🔎 Satır Filtreleme: filter(df, condition) eşleşen satırları korur ve koşullar, AND için ampersand veya OR için dikey çizgi ile birleştirilir.
  • 🔣 Sıralama: arrange() fonksiyonu varsayılan olarak satırları artan sırada sıralar ve desc() fonksiyonu herhangi bir sütunu tersine çevirir.
  • 🔗 Pipe Operator: %>% operatörü her sonucu doğrudan bir sonraki fiile aktarır, böylece ara nesneler ortamı karmaşıklaştırmaz.
  • 🧹 Yardımcı Fonksiyonlar: `starts_with()`, `contains()` ve `where()` fonksiyonları, sütunları isme göre değil, desene veya türe göre seçer.
  • 📐 Fiil Sırası Önemlidir: Verileri azaltmak için önce filtreleme yapın, ardından seçim yapın ve son olarak düzenleme yapın; bu sayede sonraki her adım daha ucuz olur.

R Seç Filtre Düzenle İşlem Hattı

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

SSS

`magrittr` `%>%` borusu `dplyr` ile birlikte gelir ve nokta içeren yer tutucu sözdizimini destekler. Yerel `|>` borusu `R 4.1`'de geldi ve herhangi bir pakete ihtiyaç duymaz. Her ikisi de sol taraftaki sonucu sağ taraftaki ilk argümana iletir.

Hayır. Her `dplyr` komutu yeni bir veri çerçevesi döndürür ve girdiyi olduğu gibi bırakır. Değişikliğin kalıcı olması için sonucu bir nesneye atamanız veya ileriye doğru aktarmanız gerekir.

NA ile karşılaştırma TRUE yerine NA döndürür ve filter() yalnızca TRUE olan satırları tutar. Eksik değerleri kasıtlı olarak seçmek için is.na() kullanın veya bunları kaldırmak için tidyr'den drop_na() işlevini kullanın.

Yapay zeka modelleri için özellik mühendisliği çoğunlukla satırları filtrelemek, sütunları seçmek ve sıralamaktan ibarettir. dplyr bu adımları, gözden geçirenlerin denetleyebileceği okunabilir işlem hatları olarak ifade eder; bu da bir eğitim veri setinin tekrarlanabilir olması gerektiğinde önemlidir.

Evet. Yapay zeka asistanları, parantez içindeki alt kümelemeyi select() ve filter() çağrılarına çevirebilir ve boru işaretini açıklayabilir. Her zaman her iki sürümü de çalıştırın ve boyutları karşılaştırın, çünkü temel R ve dplyr eksik değerleri farklı şekilde ele alır.

Bu yazıyı şu şekilde özetleyin: