R Select(), Filter(), Arrange(), Pipeline dengan Contoh

Pustaka yang disebut dplyr berisi kata kerja berharga untuk bernavigasi di dalam kumpulan data. Melalui tutorial ini, Anda akan menggunakan kumpulan data Waktu perjalanan. Kumpulan data tersebut mengumpulkan informasi tentang perjalanan yang dipimpin oleh seorang pengemudi antara rumahnya dan tempat kerjanya. Ada empat belas variabel dalam dataset, antara lain:

  • DayOfWeek: Identifikasi hari dalam seminggu pengemudi menggunakan mobilnya
  • Jarak: Total jarak perjalanan
  • MaxSpeed: Kecepatan maksimum perjalanan
  • TotalTime: Durasi perjalanan dalam menit

Kumpulan data tersebut memiliki sekitar 200 observasi dalam kumpulan data, dan perjalanan terjadi di antaranya Monday sampai hari Jumat.

Pertama-tama, Anda perlu:

  • memuat kumpulan data
  • memeriksa struktur datanya.

Salah satu fitur praktis dengan dplyr adalah fungsi sekilas(). Ini merupakan peningkatan dari str(). Kita dapat menggunakan sekilas() untuk melihat struktur dataset dan memutuskan manipulasi apa yang diperlukan.

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

Keluaran:

## 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...	

Hal ini jelas bahwa variabel Komentar memerlukan diagnosis lebih lanjut. Pengamatan pertama pada variabel Komentar hanya berupa nilai yang hilang.

sum(df$Comments =="")

Penjelasan Kode

  • sum(df$Comments ==””): Jumlahkan observasi sama dengan “” di kolom komentar dari df

Keluaran:

## [1] 181

Pilih()

Kita akan mulai dengan kata kerja select(). Kita tidak selalu memerlukan semua variabel, dan praktik yang baik adalah memilih hanya variabel yang Anda anggap relevan.

Kami memiliki 181 observasi yang hilang, hampir 90 persen dari kumpulan data. Jika Anda memutuskan untuk mengecualikannya, Anda tidak akan dapat melanjutkan analisis.

Kemungkinan lainnya adalah menghilangkan variabel Comment dengan kata kerja select().

Kita dapat memilih variabel dengan cara berbeda dengan select(). Perhatikan bahwa argumen pertama adalah kumpulan data.

- `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.	

Anda dapat menggunakan cara ketiga untuk mengecualikan variabel Komentar.

step_1_df <- select(df, -Comments)
dim(df)

Keluaran:

## [1] 205  14
dim(step_1_df)

Keluaran:

## [1] 205  13

Kumpulan data asli memiliki 14 fitur sedangkan step_1_df memiliki 13 fitur.

Saring()

Kata kerja filter() membantu menjaga pengamatan mengikuti suatu kriteria. Filter() bekerja persis seperti select(), Anda memasukkan kerangka data terlebih dahulu, lalu kondisi yang dipisahkan dengan koma:

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

Satu kriteria

Pertama-tama, Anda dapat menghitung jumlah observasi dalam setiap level variabel faktor.

table(step_1_df$GoingTo)

Penjelasan Kode

  • table(): Hitung jumlah observasi berdasarkan level. Catatan, hanya variabel tingkat faktor yang diterima
  • table(step_1_df$GoingTo): Hitung jumlah perjalanan menuju tujuan akhir.

Keluaran:

## 
##  GSK Home 
##  105  100	

Fungsi table() menunjukkan 105 perjalanan menuju GSK dan 100 ke Beranda.

Kita dapat memfilter data untuk mengembalikan satu kumpulan data dengan 105 observasi dan kumpulan data lainnya dengan 100 observasi.

# Select observations
if GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

Keluaran:

## [1] 100  14
# Select observations
if GoingTo == Work
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

Keluaran:

## [1] 105  14

Berbagai kriteria

Kita dapat memfilter kumpulan data dengan lebih dari satu kriteria. Misalnya, Anda dapat mengekstrak observasi yang tujuannya adalah Rumah dan terjadi pada hari Rabu.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

Keluaran:

## [1] 23 14

23 observasi cocok dengan kriteria ini.

Pipa saluran

Pembuatan dataset memerlukan banyak operasi, seperti:

  • pengimporan
  • penggabungan
  • memilih
  • penyaringan
  • dan sebagainya

Pustaka dplyr dilengkapi dengan operator praktis, %>%, yang disebut pipa saluran. Fitur pipeline membuat manipulasi menjadi bersih, cepat, dan tidak menimbulkan kesalahan.

Operator ini adalah kode yang melakukan langkah-langkah tanpa menyimpan langkah-langkah perantara ke hard drive. Jika Anda kembali ke contoh di atas, Anda dapat memilih variabel yang diinginkan dan memfilternya. Kami memiliki tiga langkah:

  • Langkah 1: Impor data: Impor data gps
  • Langkah 2: Pilih data: Pilih GoingTo dan DayOfWeek
  • Langkah 3: Filter data: Kembali ke Rumah dan Rabu saja

Kita dapat menggunakan cara yang sulit untuk melakukannya:

# 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)

Keluaran:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

Itu bukanlah cara yang nyaman untuk melakukan banyak operasi, terutama dalam situasi dengan banyak langkah. Lingkungan berakhir dengan banyak objek yang disimpan.

Mari kita gunakan operator saluran pipa %>% sebagai gantinya. Kita hanya perlu mendefinisikan kerangka data yang digunakan di awal dan semua proses akan mengalir darinya.

Sintaks dasar pipa

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 the pipe operator `%`, you don't have instructions to pipe anymore
Note: Create a new variable is optional. If not included, the output will be displayed in the console.

Anda dapat membuat pipa pertama Anda dengan mengikuti langkah-langkah yang disebutkan di atas.

# 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)

Keluaran:

## [1] TRUE

Kami siap membuat kumpulan data yang menakjubkan dengan operator saluran pipa.

mengatur()

Dalam majalah tutorial sebelumnya, Anda mempelajari cara mengurutkan nilai dengan fungsi sort(). Perpustakaan dplyr memiliki fungsi penyortirannya. Ini bekerja seperti pesona dengan pipa. Kata kerja arrange() dapat menyusun ulang satu atau beberapa baris, baik menaik (default) atau menurun.

- `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

Kita bisa mengurutkan jarak berdasarkan tujuan.

# Sort by destination and distance
step_2_df <-step_1_df %>%
	arrange(GoingTo, Distance)
head<step_2_df)

Keluaran:

##     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

Ringkasan

Pada tabel di bawah, Anda merangkum semua operasi yang Anda pelajari selama tutorial.

Kata kerja Tujuan Kode Penjelasan
melihat sekilas periksa struktur df
glimpse(df)
Identik dengan str()
Pilih() Pilih/kecualikan variabel
select(df, A, B ,C)
Pilih variabel A, B dan C
select(df, A:C)
Pilih semua variabel dari A hingga C
select(df, -C)
Kecualikan C
Saring() Filter df berdasarkan satu atau banyak kondisi
filter(df, condition1)
Satu syarat
filter(df, condition1
ketentuan2)
mengatur() Urutkan kumpulan data dengan satu atau banyak variabel
arrange(A)
Semacam variabel A menaik
arrange(A, B)
Semacam variabel A dan B
arrange(desc(A), B)
Urutan menurun dari variabel A dan urutan naik dari B
%>% Buat alur di antara setiap langkah
step 1 %>% step 2 %>% step 3