Salah satu kemampuan yang paling dasar untuk seorang Data Scienctist adalah Persiapan Data (Manipulasi Data). Agar menjadi efektif, Anda perlu paham betul dalam melakukan manipulasi data. Ini dikarenakan sebagian besar pekerjaan Anda hanya akan menyangkut mengumpulkan dan membersihkan data.
Data Scientist meluangkan 60% waktu mereka untuk membersihkan dan mengorganisir data. Mengumpulkan data set berada di posisi ke-2 dengan besar 19%, yang berarti Data Scientist meluangkan sekitar 80% waktu mereka untuk menyiapkan dan memanajemen data untuk dianalisis.
Di bagian ini, Anda akan belajar bagaimana cara melakukan persiapan data dengan mudah menggunakan R. Kita akan memberikan beberapa kata kunci dasar manipulasi data yang akan Anda sering pakai di pekerjaan Anda.
read_csv() Mengimport data (Anda bisa menggunakan yang lain)str() Struktur Dataapply() Untuk mengecek dan mengganti data yang hilangselect() Memilih kolom mana yang akan dimasukanfilter() Memilih subset dari data yang ditentukanarrange() Menyusun data, dari ukuran variabel kontinu, dari tanggal, atau secara alfabetrename() Mengganti nama kolommutate() Menambahkan kolom baru pada data, atau mengganti kolom yang sudah adabind_rows() Menggabungkan dua data frame menjadi satu dan mengkombinasikan data dari kolom sekaligusgroup_by Mengelompokan data dengan berbagai kategori variabelsummarize() Meringkas atau mengumpulkan (untuk masing-masing kelompok menggunakan group_by). Biasa digunakan di konjungsi dengan beberapa fungsi termasuk:
mean() Menghitung rata-ratamedian() Menghitung nilai tengahmax() Mencari nilai tertinggimin() Mencari nilai terendahsum() Menjumlahkan semua nilai bersamaann() Menghitung angka pada catatanSaya merekomendasikan anda untuk menginstall packages tidyverse. Karena inti dari tidyverse termasuk packages yang akan Anda sering gunakan untuk analisis data setiap harinya.
install.packages("tidyverse")
Kita biasanya bekerja menggunakan 2 packages sangat berguna yang diciptakan oleh Hadley Wickham, ketua peneliti di RStudio:
readr Untuk membaca dan menulis CSV dan jenis text lain.dplyr Untuk memproses dan memanipulasi data.Data yang akan kita gunakan pada bagian ini adalah pfizer.csv dan fda.csv. Mohon download dan letakan pada desktop Anda. Sebagai opsional, Anda dapat meng-load data ke R Session yang sedang digunakan dengan memilih Import Dataset>From Text File... di tab “Environment”. Tapi dalam kasus ini, kita akan menggunakan fungsi read_csv dari packages readr. Salin perintah dibawah pada coding anda dan jalankan:
suppressPackageStartupMessages(library(tidyverse))# Meng-load packages tidyverse tidyverse secara diam-diam
#setwd("C:/Users/H/Desktop/Week_10") # Selalu ingat untuk mengatur working directory
pfizer <- read_csv("pfizer.csv") # Meng-load data `pfizer` ##
## -- Column specification --------------------------------------------------------
## cols(
## org_indiv = col_character(),
## first_plus = col_character(),
## first_name = col_character(),
## last_name = col_character(),
## city = col_character(),
## state = col_character(),
## category = col_character(),
## cash = col_double(),
## other = col_double(),
## total = col_double()
## )
##
## -- Column specification --------------------------------------------------------
## cols(
## name_last = col_character(),
## name_first = col_character(),
## name_middle = col_character(),
## issued = col_date(format = ""),
## office = col_character()
## )
Sadar bahwa Anda akan membutuhkan pengertian yang kuat dari jenis dasar data dan struktur data serta bagaimana cara mengoperasikan mereka. Fungsi str() akan memberi tau Anda tentang kolom di dalam data, termasuk jenis data mereka. Salin perintah ini pada coding anda dan jalankan:
## tibble [10,087 x 10] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ org_indiv : chr [1:10087] "3-D MEDICAL SERVICES LLC" "AA DOCTORS, INC." "ABBO, LILIAN MARGARITA" "ABBO, LILIAN MARGARITA" ...
## $ first_plus: chr [1:10087] "STEVEN BRUCE" "AAKASH MOHAN" "LILIAN MARGARITA" "LILIAN MARGARITA" ...
## $ first_name: chr [1:10087] "STEVEN" "AAKASH" "LILIAN" "LILIAN" ...
## $ last_name : chr [1:10087] "DEITELZWEIG" "AHUJA" "ABBO" "ABBO" ...
## $ city : chr [1:10087] "NEW ORLEANS" "PASO ROBLES" "MIAMI" "MIAMI" ...
## $ state : chr [1:10087] "LA" "CA" "FL" "FL" ...
## $ category : chr [1:10087] "Professional Advising" "Expert-Led Forums" "Business Related Travel" "Meals" ...
## $ cash : num [1:10087] 2625 1000 0 0 1800 ...
## $ other : num [1:10087] 0 0 448 119 0 0 47 0 0 396 ...
## $ total : num [1:10087] 2625 1000 448 119 1800 ...
## - attr(*, "spec")=
## .. cols(
## .. org_indiv = col_character(),
## .. first_plus = col_character(),
## .. first_name = col_character(),
## .. last_name = col_character(),
## .. city = col_character(),
## .. state = col_character(),
## .. category = col_character(),
## .. cash = col_double(),
## .. other = col_double(),
## .. total = col_double()
## .. )
## tibble [272 x 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ name_last : chr [1:272] "ADELGLASS" "ADKINSON" "ALLEN" "AMSTERDAM" ...
## $ name_first : chr [1:272] "JEFFREY" "N." "MARK" "DANIEL" ...
## $ name_middle: chr [1:272] "M." "FRANKLIN" "S." NA ...
## $ issued : Date[1:272], format: "1999-05-25" "2000-04-19" ...
## $ office : chr [1:272] "Center for Drug Evaluation and Research" "Center for Biologics Evaluation and Research" "Center for Devices and Radiological Health" "Center for Biologics Evaluation and Research" ...
## - attr(*, "spec")=
## .. cols(
## .. name_last = col_character(),
## .. name_first = col_character(),
## .. name_middle = col_character(),
## .. issued = col_date(format = ""),
## .. office = col_character()
## .. )
Ini sangatlah penting untuk dipahami karena ini adalah objek-objek yang akan Anda manipulasi setiap harinya di R. Jika Anda perlu merubah tipe data untuk kolom manapun, gunakan fungsi berikut:
as.character() Mengubah ke karakter converts to a text string.as.numeric() Mengubah ke angkaconverts to a number.as.factor() Mengubah ke kategori-kategori variabel converts to a categorical variable.as.integer() Mengubah ke bilangan bulat converts to an integeras.Date() Mengubah ke tanggal converts to a dateas.POSIXct() Mengubah ke tanggal lengkap dan waktuSebagai contoh, masukan kode berikut ke coding Anda untuk mengubah total yang telah terubah di data pfizer menjadi variabel numerik (yang akan mengizinkannya untuk menjadi nilai desimal jika kita mempunyainya).
pfizer$total <- as.numeric(pfizer$total) # Mengubah total menjadi variabel numerik
str(pfizer$total) # Mari kita periksa struktur datanya ulang## num [1:10087] 2625 1000 448 119 1800 ...
Tidak seperti programming biasa, ketika bekerja dengan data nyata, Anda mungkin memiliki Nilai yang hilang: Peungukuran yang tidak terekam/tersimpan/dll. R memiliki mekanisme untuk mengatasi nilai yang hilang. Ini dibedakan diantara jenis berikut:
NA : Data yang ditak dimasukan (nilai NA memiliki kelas juga, jadi terdapat bilangan bulat NA, karakter NA, dll)NaN : Bukanlah suatu bilangan (sebuah nilai NaN juga merupakan NA namun hasilnya tidak benar)Mencari nilai yang hilang pada kolom data frame pfizer
is.na(pfizer) # Cara klasik untuk mencari nilai NA
sum(is.na(pfizer)) # Menghitung jumlah NA
apply(is.na(pfizer),2, which) # Indeks dari NA (hanya untuk data frame)
which(complete.cases(pfizer)) # mengidentifikasi nilai lengkap yang telah diobservasiMekanisme yang lebih umum adalah mehapusnya secara manual
clean.vector<- na.omit(pfizer$first_name) # membersihkan/menyingkirkan vektor NA
clean.df <- na.omit(pfizer) # membersihkan/menyingkirkan data frame NA
apply(is.na(clean.df),2, which) # memastukan jika didalamnya ada nilai yang hilang## integer(0)
Kita juga dapat mengubah nilai yang hilang dengan rata-ratanya(medianya). Latihan yang baik adalah membuat dua variabel terpisah untuk rata-ratanya. Saat dibuat, kita dapat mengubah nilai yang hilang dengan variabel terbentuk yang baru. Mari upload datanya dan memverifikasi data yang hilang.
PATH <- "https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Missing_Values.csv"
titanic <- read.csv(PATH, sep = ",")
list_na <- colnames(titanic)[ apply(titanic, 2, anyNA) ]
list_na## [1] "Age" "Fare"
Dalam kasus ini, kita tidak menghapus semua nilai yang hilang, melainkan kita menggunakan metode apply() untuk menghitung rata-rata dari kolom dengan NA. Pertama, kita perlu menghitung rata-rata dengan argumen na.rm = TRUE. Argumen ini wajib karena kolom memiliki data yang hilang, dan memberi tau R untuk mengabaikannya.
average_missing <- apply(titanic[,colnames(titanic) %in% list_na],
2,
mean,
na.rm = TRUE)
average_missing## Age Fare
## 30.27259 35.62719
Penjelasan Perintah: Kita melewati 4 argumen di metode apply
df titanic[,colnames(titanic) %in% list_na]. Perintah ini akan mengembalikan nama kolom dari objek list_na (yaitu “age” dan “fare”)2 Mengitung fungsi pada kolommean Menghitung rata-ratanyana.rm = TRUE Mengabaikan nilai yang hilangKemudian kita dapat mengubah nilai NA. Kata kunci ‘mutate’ dari dplyr sangat berguna dalam membuat variabel baru. Kita belum tentuingin mengubah kolom aslinya jadi kita dapat membuat variabel baru tanpa NA. mutate’ sangat mudah digunakan, kita cukup memilih nama variabel dan menjelaskan bagaimana cara membuat variabel ini. Ini adalah perintah lengkapnya
titanic_replace <- titanic %>%
mutate(age = ifelse(is.na(Age), average_missing[1], Age),
fare = ifelse(is.na(Fare), average_missing[2], Fare))
sum(is.na(titanic_replace$Age))## [1] 86
## [1] 1
## [1] 0
## [1] 0
Di bagian ini Anda akan belajar bagaimana cara untuk memilih atau men-subset kolom data frame berdasarkan nama dan posisi menggunakan fungsi select() pada R dalam packages dplyr. Anda akan belajar bagaimana cara menggunakan fungsi berikut:
pull() Mengekstrak nilai suatu kolom menjadi vektor. Kolom yang dipilih dapat ditentukan berdasarkan nama maupun indeksselect() Mengekstrak satu atau lebih kolom sebagai data tabel. Ini juga dapat digunakan untuk menghapus kolom pada data frameselect_if() Memilih kolom berdasarkan suatu kondisi tertentu. Salah satu kegunaan dari fungsi ini, contohnya, memilih kolom jika datanya numerikstarts_with() , ends_with() , contains() , matches() : Memilih kolom atau variabel berdasarkan nama merekalibrary(tidyverse) # Men-load `tidyverse`, dimana termasuk ddalam `dplyr`
pfizer %>% pull(state) %>% head() # Mengekstrak nilai kolom dari `state` menjadi sebuah vektor
pfizer %>% select(1:3) # Memilih kolom 1 sampai 3
pfizer %>% select(1,3) # Memilih kolom 1 dan 3, tetapi 2 tidak
pfizer %>% select(state:total) # Memilih semua kolom dari `state` sampai `total`
pfizer %>% select(state,total) # Memilih kolom berdasarkan nama variabel
pfizer %>% select_if(is.numeric) # Memilih kolom yang hanya numerik
pfizer %>% select_if(is.character) # Memilih kolom yang hanya karakter
pfizer %>% select(starts_with("first")) # Memilih kolom yang diawali dengan `first`
pfizer %>% select(ends_with("name")) # Memilih kolom yang diakhiri dengan `name`
pfizer %>% select(contains("rst")) # Memilih kolom yang dertapat nama `rst`
pfizer %>% select(matches("_")) # Memilih kolom yang namanya sama dengan reguler
pfizer %>% select(-(state:total)) # Menghapus seluruh kolom dari `state` sampai `total`
pfizer %>% select(-state, -total) # Menghapus kolom `state` dan `total`Sekarang kita akan meng-filter() dan meng-arrange() data secara spesifik. Untuk setiap contoh berikut. Salin perintah yang berhubungan dengan coding Anda, dan lihat hasilnya. Lihatlah bagaimana kita membuat objek baru untuk memproses data.
Carilah dokter di California dengan bayaran $10.000 atau lebih berdasarkan Pfizer untuk menjalankan “Professional Advising”!
ca_expert_10000 <- pfizer %>% # Meng-load semua `pfizer`
filter(state == "CA" & # Meng-load semua `pfizer` di filter berdasarkan `state`
total >= 10000 & # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
category == "Professional Advising") # Kemudian memfilter bersadarkan `category`
ca_expert_10000 # Menunjukan Hasilnya## # A tibble: 35 x 10
## org_indiv first_plus first_name last_name city state category cash other
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 CUMMINGS~ JEFFREY L~ JEFFREY CUMMINGS LOS ~ CA Profess~ 13500 0
## 2 FONAROW,~ GREGG CUR~ GREGG FONAROW LOS ~ CA Profess~ 15750 0
## 3 GANZ, PE~ PETER PETER GANZ SAN ~ CA Profess~ 22000 0
## 4 GT AND A~ GEORGE GEORGE TRIADAFI~ SAN ~ CA Profess~ 33705 0
## 5 HANAHAN,~ DOUGLAS DOUGLAS HANAHAN SAN ~ CA Profess~ 37500 0
## 6 HERBERT ~ HERBERT HERBERT CRUZ FRES~ CA Profess~ 13250 0
## 7 HU, RONA~ RONA JANE RONA HU PALO~ CA Profess~ 22500 0
## 8 KAPLOWIT~ NEIL NEIL KAPLOWITZ LOS ~ CA Profess~ 12000 0
## 9 KIZER, K~ KENNETH W~ KENNETH KIZER ALIS~ CA Profess~ 10000 0
## 10 KOO, EDW~ EDWARD HA~ EDWARD MANG LA J~ CA Profess~ 12500 0
## # ... with 25 more rows, and 1 more variable: total <dbl>
Sekarang tambahkan pengurutan di akhir perintah ke daftar dokter dalam urutan menurun berdasarkan bayaran yang diterima!
ca_expert_10000 <- pfizer %>% # Meng-load semua `pfizer
filter(state == "CA" & # Memfilter berdasarkan `state` di California
total >= 10000 & # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
category == "Professional Advising")%>% # Kemudian memfilter bersadarkan `category`
arrange(desc(total)) # Urutan menurun berdasarkan bayaran yang diterima
ca_expert_10000 # Menunjukan Hasilnya## # A tibble: 35 x 10
## org_indiv first_plus first_name last_name city state category cash other
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 MALENKA,~ ROBERT CH~ ROBERT MALENKA STAN~ CA Profess~ 75566 0
## 2 REGENTS ~ DAVID RAY~ DAVID GANDARA IRVI~ CA Profess~ 38500 0
## 3 PTACEK, ~ LOUIS JOHN LOUIS PTACEK SAN ~ CA Profess~ 37588 0
## 4 HANAHAN,~ DOUGLAS DOUGLAS HANAHAN SAN ~ CA Profess~ 37500 0
## 5 REGENTS ~ JOHN POWER JOHN KANE IRVI~ CA Profess~ 37500 0
## 6 RISCH, S~ SAMUEL CR~ SAMUEL RISCH SAN ~ CA Profess~ 36000 0
## 7 GT AND A~ GEORGE GEORGE TRIADAFI~ SAN ~ CA Profess~ 33705 0
## 8 SANDROCK~ CHRISTIAN~ CHRISTIAN SANDROCK SACR~ CA Profess~ 33000 0
## 9 MATTHEW ~ MATTHEW J~ MATTHEW BUDOFF MANH~ CA Profess~ 31500 0
## 10 OLEFSKY,~ JERROLD M~ JERROLD OLEFSKY SOLA~ CA Profess~ 27746 0
## # ... with 25 more rows, and 1 more variable: total <dbl>
Carilah dokter di California/New York dengan bayaran $10.000 atau lebih berdasarkan Pfizer untuk menjalankan “Professional Advising”!
Perhatikan bahwa, dalam kasus ini kita menggunakan | dari Boolean operator, dan tanda kurung disekitar bagian query. Ini memastikan bahwa bagian query ini berjalan terlebih dahulu. Lihat apa yang terjadi jika Anda mengecualikan mereka.
ca_ny_expert_10000 <- pfizer %>% # Meng-load semua `pfizer`
filter((state == "CA" | state == "NY") & # Memfilter berdasarkan `state` di California atau New York
total >= 10000 & # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
category == "Professional Advising")%>% # Kemudian memfilter bersadarkan `category`
arrange(desc(total)) # Urutan menurun berdasarkan bayaran yang diterima
ca_ny_expert_10000 # Menunjukan Hasilnya## # A tibble: 46 x 10
## org_indiv first_plus first_name last_name city state category cash other
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 SAWYERS,~ CHARLES L~ CHARLES SAWYERS NEW ~ NY Profess~ 100000 0
## 2 MALENKA,~ ROBERT CH~ ROBERT MALENKA STAN~ CA Profess~ 75566 0
## 3 REGENTS ~ DAVID RAY~ DAVID GANDARA IRVI~ CA Profess~ 38500 0
## 4 PTACEK, ~ LOUIS JOHN LOUIS PTACEK SAN ~ CA Profess~ 37588 0
## 5 HANAHAN,~ DOUGLAS DOUGLAS HANAHAN SAN ~ CA Profess~ 37500 0
## 6 JAVITT, ~ DANIEL CO~ DANIEL JAVITT ORAN~ NY Profess~ 37500 0
## 7 REGENTS ~ JOHN POWER JOHN KANE IRVI~ CA Profess~ 37500 0
## 8 RISCH, S~ SAMUEL CR~ SAMUEL RISCH SAN ~ CA Profess~ 36000 0
## 9 GT AND A~ GEORGE GEORGE TRIADAFI~ SAN ~ CA Profess~ 33705 0
## 10 SANDROCK~ CHRISTIAN~ CHRISTIAN SANDROCK SACR~ CA Profess~ 33000 0
## # ... with 36 more rows, and 1 more variable: total <dbl>
Carilah dokter selain di California dengan bayaran $10.000 atau lebih berdasarkan Pfizer untuk menjalankan “Professional Advising”!
not_ca_expert_10000 <- pfizer %>% # Meng-load semua `pfizer`
filter(state != "CA" & # Memfilter berdasarkan `state` selain di California
total >= 10000 & # Memfilter juga berdasarkan `total` lebih atau sama dengan 10000
category == "Professional Advising")%>% # Kemudian memfilter bersadarkan `category`
arrange(desc(total)) # Urutan menurun berdasarkan bayaran yang diterima
not_ca_expert_10000 # Menunjukan Hasilnya## # A tibble: 135 x 10
## org_indiv first_plus first_name last_name city state category cash other
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 BAILES, ~ JOSEPH SW~ JOSEPH BAILES AUST~ TX Profess~ 105000 0
## 2 SAWYERS,~ CHARLES L~ CHARLES SAWYERS NEW ~ NY Profess~ 100000 0
## 3 MARDER, ~ HAROLD KAY HAROLD MARDER PHIL~ PA Profess~ 87610 0
## 4 WILLIAMS~ GRANT GRANT WILLIAMS WAYNE PA Profess~ 85621 0
## 5 THE SCHE~ PHILIP SA~ PHILIP SCHEIN BRYN~ PA Profess~ 75609 0
## 6 GORDON, ~ JEFFREY I~ JEFFREY GORDON SAIN~ MO Profess~ 75108 0
## 7 KOLLEF, ~ MARIN HRI~ MARIN KOLLEF SAIN~ MO Profess~ 72750 0
## 8 JOSEPH, ~ WARREN S WARREN JOSEPH HUNT~ PA Profess~ 71875 0
## 9 SHORR, A~ ANDREW FR~ ANDREW SHORR WASH~ DC Profess~ 62000 0
## 10 MAYO FOU~ PETER JAM~ PETER DYCK ROCH~ MN Profess~ 61175 0
## # ... with 125 more rows, and 1 more variable: total <dbl>
Carilah 20 dokter di 4 negara bagian terbesar (CA, TX, FL, NY) dengan bayaran harga tertinggi untul “Expert-Led Forums”!
ca_ny_tx_fl_prof_top20 <- pfizer %>%
filter((state == "CA" |
state == "NY" |
state == "TX" |
state == "FL") &
category == "Expert-Led Forums") %>%
arrange(desc(total)) %>%
head(20)
ca_ny_tx_fl_prof_top20## # A tibble: 20 x 10
## org_indiv first_plus first_name last_name city state category cash other
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 SACKS, G~ GERALD MI~ GERALD SACKS SANT~ CA Expert-~ 146500 0
## 2 NIDES, M~ MITCHELL MITCHELL NIDES LOS ~ CA Expert-~ 70500 0
## 3 ROBERT B~ ROBERT BU~ ROBERT NETT SAN ~ TX Expert-~ 60750 0
## 4 SOLERA C~ STEVEN AB~ STEVEN KAPLAN CHAP~ NY Expert-~ 56500 0
## 5 GRIFFIN,~ JAMES DALE JAMES GRIFFIN DALL~ TX Expert-~ 54250 0
## 6 STUBBLEF~ MICHAEL D MICHAEL STUBBLEF~ NEW ~ NY Expert-~ 50500 0
## 7 POTKIN, ~ STEVEN GA~ STEVEN POTKIN ORAN~ CA Expert-~ 48350 0
## 8 GINSBERG~ DAVID ALAN DAVID GINSBERG LOS ~ CA Expert-~ 45750 0
## 9 LOUIE, S~ SAMUEL SAMUEL LOUIE SACR~ CA Expert-~ 41250 0
## 10 INSTITUT~ GURKIPAL GURKIPAL SINGH WOOD~ CA Expert-~ 40000 0
## 11 NEURONLI~ JEFFREY B~ JEFFREY GELBLUM MIAMI FL Expert-~ 39200 0
## 12 HENNEKEN~ CHARLES H CHARLES HENNEKENS BOCA~ FL Expert-~ 33250 0
## 13 SOBHY EL~ SAAD A SAAD SOBHY SYRA~ NY Expert-~ 31500 0
## 14 COHEN, L~ LEE STEVEN LEE COHEN HAST~ NY Expert-~ 30500 0
## 15 BAROYA, ~ IVAN STEP~ IVAN BAROYA BONI~ CA Expert-~ 26400 0
## 16 JONES, S~ STEPHEN E~ STEPHEN JONES DALL~ TX Expert-~ 26250 0
## 17 CRANE, D~ DANIEL LI~ DANIEL CRANE NEW ~ NY Expert-~ 25500 0
## 18 AXONZ INC STANLEY J STANLEY KROLCZYK WESL~ FL Expert-~ 24750 0
## 19 MATTHEW ~ MATTHEW J~ MATTHEW BUDOFF MANH~ CA Expert-~ 24000 0
## 20 QUANG H ~ QUANG H QUANG NGUYEN LA J~ CA Expert-~ 22500 0
## # ... with 1 more variable: total <dbl>
Filterlah data pfizer untuk semua pembayaran untuk menjalankan “Expert-Led Forums” atau untuk “Professional Advising”, dan urutkan secara alfabet berdasarkan nama dokter (nama belakang, kemudian nama depan)
expert_professional_advice <- pfizer %>%
filter(category == "Expert-Led Forums" |
category == "Professional Advising") %>%
arrange(last_name, first_name)
expert_professional_advice## # A tibble: 4,382 x 10
## org_indiv first_plus first_name last_name city state category cash other
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 ABBO, LI~ LILIAN MA~ LILIAN ABBO MIAMI FL Profess~ 1800 0
## 2 ABEBE, S~ SHEILA Y SHEILA ABEBE INDI~ IN Expert-~ 825 0
## 3 NEW YORK~ JUDITH ANN JUDITH ABERG NEW ~ NY Profess~ 1750 0
## 4 ABOLNIK,~ IGOR Z IGOR ABOLNIK PROVO UT Expert-~ 1750 0
## 5 ABRAKSIA~ SAMIR SAMIR ABRAKSIA BEAC~ OH Expert-~ 2000 0
## 6 ABRAKSIA~ SAMIR SAMIR ABRAKSIA BEAC~ OH Profess~ 2500 0
## 7 ABRAMSON~ STEVEN BA~ STEVEN ABRAMSON NEW ~ NY Profess~ 4400 0
## 8 ABUZZAHA~ FARUK S FARUK ABUZZAHAB MINN~ MN Profess~ 1750 0
## 9 ABUZZAHA~ MARY JENN~ MARY ABUZZAHAB SAIN~ MN Expert-~ 1000 0
## 10 ACCACHA,~ SIHAM DON~ SIHAM ACCACHA MINE~ NY Expert-~ 1250 0
## # ... with 4,372 more rows, and 1 more variable: total <dbl>
Di bagian ini, Anda akan belajar bagaimana cara mengganti nama kolom pada data frame di R. Kemudian, Anda akan belajar bagaimana cara menghitung dan menambahkan variabel baru ke dalam data frame di R. Anda akan belajar beberapa fungsi R dari package dplyr di R diantaranya sebagai berikut:
rename() Perintah ini digunakan untuk mengganti nama kolom pada data frame di Rmutate() Menghitung dan menambahkan variabel baru pada data tabel. Ini tidak mengubah variabel yang sebelumnya sudah ada.transmute() Menghitung kolom baru namun menimpa variabel yang sudah ada# Mengganti nama kolom pada data `pfizer` dengan fungsi dasar R:
names(pfizer)[names(pfizer) == "org_indiv"] <- "rename1"
names(pfizer)[1] <- "rename2"
names(pfizer)[names(pfizer)==names(pfizer)] <- c("rename3",
"rename4",
"first_name",
"last_name",
"city",
"state",
"category",
"cash",
"other",
"total")
# Mengganti nama kolom pada data `pfizer` dengan `dplyr::rename()`:
pfizer %>%
rename(
org_indiv = rename3 ,
first_plus = rename4
)## # A tibble: 10,087 x 10
## org_indiv first_plus first_name last_name city state category cash other
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 3-D MEDI~ STEVEN BR~ STEVEN DEITELZW~ NEW ~ LA Profess~ 2625 0
## 2 AA DOCTO~ AAKASH MO~ AAKASH AHUJA PASO~ CA Expert-~ 1000 0
## 3 ABBO, LI~ LILIAN MA~ LILIAN ABBO MIAMI FL Busines~ 0 448
## 4 ABBO, LI~ LILIAN MA~ LILIAN ABBO MIAMI FL Meals 0 119
## 5 ABBO, LI~ LILIAN MA~ LILIAN ABBO MIAMI FL Profess~ 1800 0
## 6 ABDULLAH~ ABDULLAH ABDULLAH RAFFEE FLINT MI Expert-~ 750 0
## 7 ABEBE, S~ SHEILA Y SHEILA ABEBE INDI~ IN Educati~ 0 47
## 8 ABEBE, S~ SHEILA Y SHEILA ABEBE INDI~ IN Expert-~ 825 0
## 9 ABILENE ~ GALEN CHR~ GALEN ALBRITTON ABIL~ TX Profess~ 3000 0
## 10 ABOLNIK,~ IGOR Z IGOR ABOLNIK PROVO UT Busines~ 0 396
## # ... with 10,077 more rows, and 1 more variable: total <dbl>
# Menambahkan kolom baru (year*) tanpa mengubah data yang sebelumnya sudah ada pada `fda`:
letters_year <- fda %>%
mutate(year = format(issued, "%Y")) %>%
group_by(year)
letters_year## # A tibble: 272 x 6
## # Groups: year [15]
## name_last name_first name_middle issued office year
## <chr> <chr> <chr> <date> <chr> <chr>
## 1 ADELGLASS JEFFREY M. 1999-05-25 Center for Drug Evaluatio~ 1999
## 2 ADKINSON N. FRANKLIN 2000-04-19 Center for Biologics Eval~ 2000
## 3 ALLEN MARK S. 2002-01-28 Center for Devices and Ra~ 2002
## 4 AMSTERDAM DANIEL <NA> 2004-11-17 Center for Biologics Eval~ 2004
## 5 AMSTUTZ HARLAN C. 2004-07-19 Center for Devices and Ra~ 2004
## 6 ANDERSON C. JOSEPH 2000-02-25 Center for Devices and Ra~ 2000
## 7 ANDREWS DAVID W. 2000-07-19 Center for Biologics Eval~ 2000
## 8 AQEL RAED <NA> 2002-10-30 Center for Devices and Ra~ 2002
## 9 ARROWSMITH PETER N. 2004-01-21 Center for Devices and Ra~ 2004
## 10 BARR JOHN D. 2000-01-14 Center for Devices and Ra~ 2000
## # ... with 262 more rows
# Menambahkan kolom baru (year*) dan (last_name*) demgan cara menimpa data yang sebelumnya sudah ada pada `fda`:
fda %>%
transmute(
year = format(issued, "%Y"),
last_name = name_last
)## # A tibble: 272 x 2
## year last_name
## <chr> <chr>
## 1 1999 ADELGLASS
## 2 2000 ADKINSON
## 3 2002 ALLEN
## 4 2004 AMSTERDAM
## 5 2004 AMSTUTZ
## 6 2000 ANDERSON
## 7 2000 ANDREWS
## 8 2002 AQEL
## 9 2004 ARROWSMITH
## 10 2000 BARR
## # ... with 262 more rows
Adapun beberapa fungsi menggabungkan di dplyr untuk mengkombinasikan data dari dua data frame. Berikut ini adalah yang paling penting: * inner_join Mengembalikan nilai dari kedua tabel hanya ketika ada kecocokan. * left_join Mengembalikan semua nilai dari tabel pertama dan ditambah dari tabel ke-dua yang sama. * semi_join Memfilter tabel pertama untuk hanya memasukan nilai yang sama dengan tabel ke-dua. * anti_join Memfilter tabel pertama untuk hanya memasukan nilai yang tidak sama dengan tabel ke-dua.
Sebagai ilustrasi, gabungan berikut akan mencari dokter yang dibayar berdasarjab pfizer untuk menjalankan forum expert-led yang juga menerima surat peringatan dari fda:
expert_warned_inner <- inner_join(pfizer, fda,
by=c("first_name" = "name_first",
"last_name" = "name_last")) %>%
filter(category=="Expert-Led Forums")
expert_warned_semi <- semi_join(pfizer, fda,
by=c("first_name" = "name_first",
"last_name" = "name_last")) %>%
filter(category=="Expert-Led Forums")Perintah pada by=c() mendefenisikan bagaimana penggabungan terbuat. Jika instruksi pada bagaimana penggabungan tabel tidak tersedia, dplyr akan mencari kolom dengan nama yang sama, dan melakukan penggabungan berdasarkan hal tersebut. Perbedaan diantara kedua gabungan diatas adalah yang pertama mencakup semua kolom dari kedua data frame, sedangkan yang ke-dua hanya memberikan kolom dari data frame pfizer.
Sebagai latihan, Anda mungkin ingin meng-inner_join dan menggunakan fungsi select milik dplyr untuk memilih kolom yang ingin Anda pertahankan, contohnya
expert_warned <- inner_join(pfizer, fda,
by=c("first_name" = "name_first",
"last_name" = "name_last")) %>%
filter(category=="Expert-Led Forums") %>%
select(last_name,
city,
state,
total,
issued)
expert_warned <- inner_join(pfizer, fda,
by=c("first_name" = "name_first",
"last_name" = "name_last")) %>%
filter(category=="Expert-Led Forums") %>%
select(2:5,10,12)Klik disini Untuk referensi yang berguna dalam mengolah penggabungan dplyr
This part introduces how to easily compute statistical summaries in R using the dplyr package. You will learn, how to:
summarise() dan group_by().Mengkalkulasi total pembayaran dari data pfizer, secara menurun!
## `summarise()` ungrouping output (override with `.groups` argument)
Mengkalkulasi beberapa summary statistik tambahan pada data pfizer, secara menurun!
state_summary <- pfizer %>%
group_by(state) %>%
summarize(sum = sum(total),
average = mean(total),
median = median(total),
min = min(total),
max = max(total),
count = n()) %>%
arrange(desc(sum))
state_summary## # A tibble: 52 x 7
## state sum average median min max count
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 1 CA 4737807 4042. 886. 25 323122 1172
## 2 TX 2802196 4491. 802 25 479314 624
## 3 FL 2564047 3474. 669 25 1185466 738
## 4 PA 2484505 4661. 669 25 672263 533
## 5 NC 2328435 6079. 777 0 857698 383
## 6 NY 2065042 2479. 750 25 100000 833
## 7 MA 1764771 6814. 1250 29 617548 259
## 8 IL 1256825 2805. 661 25 160984 448
## 9 MI 1146285 3352. 750 26 152466 342
## 10 OH 1019450 2207. 685 25 107292 462
## # ... with 42 more rows
Kelompokan dan summarize data pfizer untuk lebih dari satu kategori meningkat!
state_summary <- pfizer %>%
group_by(state, category) %>%
summarize(sum = sum(total),
average = mean(total),
median = median(total),
min = min(total),
max = max(total),
count = n()) %>%
arrange(state, category)
state_summary## # A tibble: 319 x 8
## # Groups: state [52]
## state category sum average median min max count
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 1 AK Expert-Led Forums 1750 1.75e3 1.75e3 1750 1750 1
## 2 AL Business Related Travel 29123 9.39e2 3.31e2 39 8041 31
## 3 AL Educational Items 431 6.16e1 6.70e1 47 78 7
## 4 AL Expert-Led Forums 129850 4.06e3 2.00e3 550 26250 32
## 5 AL Investigator-Initiated Resear~ 55937 5.59e4 5.59e4 55937 55937 1
## 6 AL Meals 10217 2.69e2 1.86e2 26 1385 38
## 7 AL Pfizer Sponsored Research ini~ 279485 1.40e5 1.40e5 46494 232991 2
## 8 AL Pfizer Sponsored Research ini~ 66096 6.61e4 6.61e4 66096 66096 1
## 9 AL Professional Advising 110560 5.53e3 2.00e3 702 35000 20
## 10 AR Business Related Travel 3783 2.70e2 1.41e2 27 1017 14
## # ... with 309 more rows
Filterlah data fda untuk surat yang telah terkirim mulai dari 2006 dan seterusnya kemudian summarize-kan!
year_summary <- fda %>%
filter(issued >= "2005-01-01") %>%
arrange(issued) %>%
mutate(year = format(issued, "%Y")) %>%
group_by(year) %>%
summarize(letters=n())
year_summary## # A tibble: 6 x 2
## year letters
## <chr> <int>
## 1 2005 31
## 2 2006 25
## 3 2007 11
## 4 2008 23
## 5 2009 25
## 6 2010 5
Beware: menggunakan ulang variabel akan menyebabkan hasil yang tidak lazim namun tidak perlu khawatir. R akan memberikan peringatan seperti summarise() ungrouping output (override with .groups argument).
Seperti yang saya katakan sebelumnya, dalam bab R Programming tentang penulisan fungsi untuk latihan memisahkan dan meng-test data. Disini, kita akan belajar lebih lagi bagaimana cara menggunakan packages dengan tujuan memisahkan data. Karena bagian ini sangat penting bagi data scientist terlebih lagi jika Anda mengaplikasikan Machine learning untuk menganalisis data. Pada bagian ini biasanya kita butuh untuk memisahkan dataset diantara. Dengan tujuan untung meng-test performa dari model kita, kita dapat menggunakan set percobaan untuk mengembalikan tingkat performa. Jadi, mari kita lihat beberapa packages yang dapat Anda gunakan untuk memisahkan data:
Anda dapat menggunakan dplyr untuk membuatnya sangat sederhana. Ini wajib memiliki Id variabel pada data set Anda, dimana ide yang tidak buruk, tidak hanya untuk membuat set-set baru tapi juga untuk proses pemantauan selama projek. Tambahkanlah juga belum terdapat.
library(dplyr) # Meng-load package `dplyr`
data(mtcars) # Menggunakan data dari R environment
set.seed(123) # Untuk memasikan kita menciptakan data yang sama
mtcars$id <- 1:nrow(mtcars) # tambahkan `id` juga belum terdapat dalam data
train<-mtcars %>% dplyr::sample_frac(.75) # Masukan train set
test<-dplyr::anti_join(mtcars, train, by = 'id') # Masukan test set
dim(train) # Mengecek dimensi dari train set## [1] 24 12
## [1] 8 12
Catatan: Data set ini hanya digunakan sebagai contoh, data ini tidak cocok digunakan untuk machine learning karena jumlah data yang terlalu kecil.
Ada banyak pendekatan untuk mencapai partisi data. Untuk pendekatan yang lebih lengkap, lihat fungsi createDataPartition dalam packages caTools.
library(caTools) # Meng-load package `caTools`
data(mtcars) # Menggunakan data dari R environment
set.seed(123) # Untuk memasikan kita menciptakan data yang sama
smp_size <- floor(0.75 * nrow(mtcars)) # 75% dari ukuran sampel
train_ind <- sample(seq_len(nrow(mtcars)),
size = smp_size)
train <- mtcars[train_ind, ] # Masukan train set
test <- mtcars[-train_ind, ] # Masukan test set
dim(train) # Mengecek dimensi dari train set## [1] 24 11
## [1] 8 11
packages sangat berguna lainnya yang dapat membantu anda memisahkan data set adalah caret.
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
data(mtcars) # Menggunakan data dari R environment
set.seed(123) # Untuk memasikan kita menciptakan data yang sama
intrain<-createDataPartition(mtcars$mpg,
p=0.75,list=FALSE)
train<-mtcars[intrain,]
test<-mtcars[-intrain,]
dim(train) # Mengecek dimensi dari train set## [1] 25 11
## [1] 7 11