R tutorial: Bagaimana cara mengimpor data ke R

Dapatkan buku lengkapnya
R Praktis untuk Komunikasi Massa dan Jurnalisme MSRP $ 59,95 Lihat

Artikel ini dikutip dari "Praktis R untuk Komunikasi Massa dan Jurnalisme" dengan izin dari penerbit. © 2019 oleh Taylor & Francis Group, LLC.

Sebelum Anda dapat menganalisis dan memvisualisasikan data, Anda harus memasukkan data tersebut ke R. Ada berbagai cara untuk melakukan ini, bergantung pada bagaimana data Anda diformat dan di mana lokasinya.

Biasanya, fungsi yang Anda gunakan untuk mengimpor data bergantung pada format file data. Di basis R, misalnya, Anda dapat mengimpor file CSV dengan read.csv(). Hadley Wickham membuat sebuah paket bernama readxl yang, seperti yang Anda duga, memiliki fungsi untuk membaca di file Excel. Ada paket lain, googlesheets, untuk menarik data dari spreadsheet Google.

Tetapi jika Anda tidak ingin mengingat semua itu, ada rio.

Keajaiban rio

“Tujuan rio adalah untuk membuat file data I / O [impor / keluaran] dalam R semudah mungkin dengan menerapkan tiga fungsi sederhana dalam gaya pisau Swiss-army,” menurut halaman GitHub proyek. Fungsi-fungsi yang import(), export(), dan convert().

Jadi, paket rio hanya memiliki satu fungsi untuk membaca di berbagai jenis file: import(). Jika Anda import("myfile.csv"), itu tahu menggunakan fungsi untuk membaca file CSV. import("myspreadsheet.xlsx")bekerja dengan cara yang sama. Faktanya, rio menangani lebih dari dua lusin format termasuk data yang dipisahkan tab (dengan ekstensi .tsv), JSON, Stata, dan data format lebar tetap (.fwf).

Paket yang dibutuhkan untuk tutorial ini

  • rio
  • htmltab
  • readxl
  • googlesheets
  • pacman
  • pesuruh
  • rmiscutils (pm GitHub) atau readr
  • tibble

Setelah Anda menganalisis data Anda, jika Anda ingin menyimpan hasilnya sebagai CSV, spreadsheet Excel, atau format lain, export()fungsi rio dapat mengatasinya.

Jika Anda belum memiliki paket rio di sistem Anda, instal sekarang dengan install.packages("rio").

Saya telah menyiapkan beberapa data sampel dengan data hujan salju musim dingin Boston. Anda dapat menuju ke //bit.ly/BostonSnowfallCSV dan klik kanan untuk menyimpan file sebagai BostonWinterSnowfalls.csv di direktori kerja proyek R Anda saat ini. Tapi salah satu poin dari skrip adalah mengganti pekerjaan manual — membosankan atau tidak — dengan otomatisasi yang mudah direproduksi. Alih-alih mengklik untuk mengunduh, Anda dapat menggunakan download.filefungsi R dengan sintaks download.file("url", "destinationFileName.csv"):

download.file ("// bit.ly/BostonSnowfallCSV", "BostonWinterSnowfalls.csv")

Ini mengasumsikan bahwa sistem Anda akan mengalihkan dari pintasan URL Bit.ly itu dan berhasil menemukan URL file asli, //raw.githubusercontent.com/smach/NICAR15data/master/BostonWinterSnowfalls.csv. Saya terkadang mengalami masalah saat mengakses konten web di PC Windows lama. Jika Anda memiliki salah satunya dan tautan Bit.ly ini tidak berfungsi, Anda dapat menukar URL yang sebenarnya dengan tautan Bit.ly. Opsi lain adalah memutakhirkan PC Windows Anda ke Windows 10 jika memungkinkan untuk melihat apakah itu berhasil.

Jika Anda ingin rio bisa mengimpor data langsung dari URL, sebenarnya itu bisa, dan saya akan membahasnya di bagian selanjutnya. Inti dari bagian ini adalah untuk berlatih bekerja dengan file lokal.

Setelah Anda memiliki file pengujian di sistem lokal Anda, Anda dapat memuat data tersebut ke dalam objek R yang disebut snowdata dengan kode:

snowdata <- rio :: import ("BostonWinterSnowfalls.csv")

Perhatikan bahwa ada kemungkinan rio akan meminta Anda untuk mengunduh ulang file dalam format biner, dalam hal ini Anda harus menjalankannya

download.file ("// bit.ly/BostonSnowfallCSV", "BostonWinterSnowfall.csv", mode = "wb")

Pastikan untuk menggunakan opsi penyelesaian tab RStudio. Jika Anda mengetik rio::dan menunggu, Anda akan mendapatkan daftar semua fungsi yang tersedia. Ketik snowdan tunggu, dan Anda akan melihat nama lengkap objek Anda sebagai opsi. Gunakan tombol panah atas dan bawah untuk berpindah di antara saran pelengkapan otomatis. Setelah opsi yang Anda inginkan disorot, tekan tombol Tab (atau Enter) untuk menambahkan objek atau nama fungsi lengkap ke skrip Anda.

Anda akan melihat objek tersebut snowdatamuncul di tab lingkungan Anda di panel kanan atas RStudio. (Jika panel kanan atas menunjukkan Riwayat perintah Anda, bukan Lingkungan Anda, pilih tab Lingkungan.)

Taylor & Francis Group

snowdataharus menunjukkan bahwa ia memiliki 76 "obs." - observasi, atau baris - dan dua variabel, atau kolom. Jika Anda mengklik panah di sebelah kiri snowdatauntuk memperluas daftar, Anda akan melihat dua nama kolom dan jenis data yang dimiliki setiap kolom. The Winteradalah string karakter dan Totalkolom numerik. Anda juga harus dapat melihat beberapa nilai pertama dari setiap kolom di panel Lingkungan.

Taylor & Francis Group

Klik kata snowdataitu sendiri di tab Lingkungan untuk tampilan data Anda yang lebih seperti spreadsheet. Anda bisa mendapatkan tampilan yang sama dari konsol R dengan perintah View(snowdata)(yang harus berupa huruf besar V pada Tampilan — viewtidak akan berfungsi). Catatan: snowdatatidak dalam tanda kutip karena Anda merujuk ke nama objek R di lingkungan Anda. Di rio::importperintah sebelumnya, BostonWinterSnowfalls.csv ada dalam tanda kutip karena itu bukan objek R; itu adalah nama string karakter dari file di luar R.

Taylor & Francis Group

Tampilan ini memiliki beberapa perilaku seperti spreadsheet. Klik tajuk kolom untuk mengurutkan menurut nilai kolom itu dalam urutan menaik; klik tajuk kolom yang sama untuk kedua kalinya untuk mengurutkan dalam urutan menurun. Ada kotak pencarian untuk menemukan baris yang cocok dengan karakter tertentu.

Jika Anda mengklik ikon Filter, Anda mendapatkan filter untuk setiap kolom. The Winterkolom karakter bekerja seperti yang Anda harapkan, penyaringan untuk setiap baris yang berisi karakter yang Anda ketik. Jika Anda mengklik pada Totalkolom filter numerik, meskipun, versi RStudio menunjukkan slider sementara yang lebih baru menunjukkan histogram dan kotak untuk penyaringan .

Impor file dari web

Jika Anda ingin mendownload dan mengimpor file dari web, Anda dapat melakukannya jika tersedia untuk umum dan dalam format seperti Excel atau CSV. Mencoba

data salju <- rio :: import ("// bit.ly/BostonSnowfallCSV", format)

Banyak sistem dapat mengikuti URL pengalihan ke file tersebut bahkan setelah pertama kali memberikan Anda pesan kesalahan, selama Anda menentukan formatnya "csv"karena nama file di sini tidak disertakan .csv. Jika milik Anda tidak berfungsi, gunakan URL //raw.githubusercontent.com/smach/R4JournalismBook/master/data/BostonSnowfall.csv sebagai gantinya.

rio juga dapat mengimpor tabel HTML yang diformat dengan baik dari halaman web, tetapi tabel harus diformat dengan sangat baik. Misalnya Anda ingin mengunduh tabel yang menjelaskan peringkat keparahan Dinas Cuaca Nasional untuk badai salju. Halaman Indeks Hujan Salju Regional Pusat Informasi Lingkungan Nasional hanya memiliki satu tabel, dibuat dengan sangat baik, jadi kode seperti ini seharusnya berfungsi:

rsi_description <- rio :: import ("//www.ncdc.noaa.gov/snow-and-ice/rsi/", format = "html")

Perhatikan lagi bahwa Anda perlu memasukkan format, dalam kasus ini format="html". karena URL itu sendiri tidak memberikan indikasi apa pun tentang jenis file itu. Jika URL menyertakan nama file dengan .htmlekstensi, rio akan tahu.

Namun dalam kehidupan nyata, data web jarang muncul dalam bentuk yang begitu rapi dan terisolasi. Pilihan yang baik untuk kasus yang tidak dibuat dengan baik sering kali adalah paket htmltab. Instal dengan install.packages("htmltab"). Fungsi paket untuk membaca tabel HTML juga disebut htmltab. Tetapi jika Anda menjalankan ini:

perpustakaan (htmltab) tabel kota <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population") str (tabel kota)

Anda melihat bahwa Anda tidak memiliki tabel yang benar, karena bingkai data berisi satu objek. Karena saya tidak menentukan tabel mana , itu menarik tabel HTML pertama di halaman. Bukan itu yang saya inginkan. Saya tidak ingin mengimpor setiap tabel di halaman sampai saya menemukan tabel yang tepat, tetapi untungnya saya memiliki ekstensi Chrome yang disebut Table Capture yang memungkinkan saya melihat daftar tabel di halaman.

Terakhir kali saya periksa, tabel 5 dengan lebih dari 300 baris adalah yang saya inginkan. Jika itu tidak berhasil untuk Anda sekarang, coba pasang Tangkapan Tabel di browser Chrome untuk memeriksa tabel mana yang ingin Anda unduh.

Saya akan mencoba lagi, menentukan tabel 5 dan kemudian melihat nama kolom apa yang ada di tabel kota baru. Perhatikan bahwa dalam kode berikut, saya meletakkan citytable <- htmltab()perintah ke beberapa baris. Itu agar tidak melampaui margin — Anda dapat menyimpan semuanya dalam satu baris. Jika nomor tabel telah berubah sejak artikel ini diposting, ganti which = 5dengan nomor yang benar.

Alih-alih menggunakan halaman di Wikipedia, Anda dapat mengganti URL Wikipedia dengan URL dari salinan file yang saya buat. File itu ada di //bit.ly/WikiCityList. Untuk menggunakan versi itu, ketik di bit.ly/WikiCityListbrowser, lalu salin URL panjang yang dialihkan ke dan gunakan itu sebagai ganti URL Wikipedia pada kode di bawah ini:

perpustakaan (htmltab) tabel kota <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population", yang = 5) nama kolom (tabel kota)

Bagaimana saya tahu whichargumen yang saya perlukan untuk menentukan nomor tabel? Saya membaca htmltabfile bantuan menggunakan perintah ?htmltab. Itu termasuk semua argumen yang tersedia. Saya memindai kemungkinan, dan " whichvektor dengan panjang satu untuk identifikasi tabel di dokumen" tampak ke kanan.

Perhatikan juga, yang saya gunakan colnames(citytable)bukan names(citytable)untuk melihat nama kolom. Keduanya akan berhasil. Basis R juga memiliki  rownames()fungsi.

Bagaimanapun, hasil tabel tersebut jauh lebih baik, meskipun Anda dapat melihat dari menjalankan str(citytable)bahwa beberapa kolom yang seharusnya berupa angka masuk sebagai string karakter. Anda dapat melihat ini baik di chrsamping nama kolom dan tanda kutip di sekitar nilai seperti 8,550,405.

Ini adalah salah satu gangguan kecil R: R umumnya tidak mengerti bahwa itu 8,550adalah angka. Saya mengatasi masalah ini sendiri dengan menulis fungsi saya sendiri di paket rmiscutils saya sendiri untuk mengubah semua "string karakter" yang benar-benar angka dengan koma kembali menjadi angka. Siapapun dapat mendownload paket dari GitHub dan menggunakannya.

Cara paling populer untuk menginstal paket dari GitHub adalah dengan menggunakan paket yang disebut devtools. devtools adalah paket yang sangat kuat yang dirancang terutama untuk orang yang ingin menulis paket mereka sendiri , dan ini menyertakan beberapa cara untuk menginstal paket dari tempat lain selain CRAN. Namun, devtools biasanya memerlukan beberapa langkah tambahan untuk diinstal dibandingkan dengan paket biasa, dan saya ingin membiarkan tugas admin sistem yang mengganggu sampai benar-benar diperlukan.

Namun, paket pacman juga menginstal paket dari sumber non-CRAN seperti GitHub. Jika Anda belum melakukannya, instal pacman denganinstall.packages("pacman").

p_install_gh("username/packagerepo")fungsi pacman diinstal dari repo GitHub.

p_load_gh("username/packagerepo")memuat paket ke dalam memori jika sudah ada di sistem Anda, dan menginstal terlebih dahulu kemudian memuat paket dari GitHub jika paket tersebut tidak ada secara lokal.

Paket utilitas rmisc saya dapat ditemukan di smach/rmiscutils. Jalankan pacman::p_load_gh("smach/rmiscutils")untuk menginstal paket rmiscutils saya.

Catatan: Paket alternatif untuk menginstal paket dari GitHub disebut remote, yang dapat Anda instal melalui  install.packages("remotes"). Tujuan utamanya adalah menginstal paket dari repositori jarak jauh seperti GitHub. Anda dapat melihat file bantuan dengan help(package="remotes").

Dan, mungkin yang paling apik dari semuanya adalah paket bernama githubinstall. Ini bertujuan untuk menebak repo tempat sebuah paket berada. Instal melalui  install.packages("githubinstall"); maka Anda dapat menginstal paket rmiscutils saya menggunakan  githubinstall::gh_install_packages("rmiscutils"). Anda ditanya apakah Anda ingin menginstal paket di smach/rmisutils(Anda lakukan).

Sekarang setelah Anda menginstal koleksi fungsi saya, Anda dapat menggunakan number_with_commas()fungsi saya untuk mengubah string karakter yang seharusnya menjadi angka kembali menjadi angka. Saya sangat menyarankan untuk menambahkan kolom baru ke bingkai data daripada mengubah kolom yang ada — itu adalah praktik analisis data yang baik, apa pun platform yang Anda gunakan.

Dalam contoh ini, saya akan memanggil kolom baru PopEst2017. (Jika tabel telah diperbarui sejak itu, gunakan nama kolom yang sesuai.)

library (rmiscutils) citytable $ PopEst2017 <- number_with_commas (citytable $ `2017 estimasi`)

Paket rmiscutils saya bukan satu-satunya cara untuk menangani nomor impor yang memiliki koma. Setelah saya membuat paket rmiscutils dan number_with_commas()fungsinya, lahirlah paket tidyverse readr. readr juga menyertakan fungsi yang mengubah string karakter menjadi angka , parse_number().

Setelah menginstal readr, Anda dapat menghasilkan angka dari kolom estimasi 2017 dengan readr:

citytable $ PopEst2017 <- readr :: parse_number (citytable $ `2017 perkiraan`)

Salah satu keuntungannya readr::parse_number()adalah Anda dapat menentukan sendiri locale()untuk mengontrol hal-hal seperti encoding dan tanda desimal, yang mungkin menarik bagi pembaca yang tidak berbasis di AS. Jalankan ?parse_number untuk informasi lebih lanjut.

Catatan: Jika Anda tidak menggunakan penyelesaian tab untuk kolom perkiraan tahun 2017, Anda mungkin mengalami masalah dengan nama kolom tersebut jika terdapat spasi di dalamnya pada saat Anda menjalankan kode ini. Dalam kode saya di atas, perhatikan ada tanda kutip tunggal mundur ( `) di sekitar nama kolom. Itu karena nama yang ada memiliki spasi di dalamnya, yang seharusnya tidak Anda miliki di R. Nama kolom itu memiliki masalah lain: Dimulai dengan angka, umumnya juga R no-no. RStudio mengetahui hal ini, dan secara otomatis menambahkan tanda kutip belakang yang diperlukan di sekitar nama dengan tab autocomplete.

Tip bonus: Ada paket R (tentu saja ada!) Yang disebut petugas kebersihan yang dapat secara otomatis memperbaiki nama kolom bermasalah yang diimpor dari sumber data yang tidak ramah R. Instal dengan install.packages("janitor"). Kemudian, Anda dapat membuat nama kolom bersih baru menggunakan clean_names()fungsi pembersih .

Sekarang, saya akan membuat bingkai data yang sama sekali baru alih-alih mengubah nama kolom pada bingkai data asli saya, dan menjalankan clean_names () petugas kebersihan pada data asli. Kemudian, periksa nama kolom bingkai data dengan names():

citytable_cleaned <- janitor :: clean_names (citytable)

nama (citytable_cleaned)

Anda melihat spasi telah diubah menjadi garis bawah, yang legal dalam nama variabel R (seperti titik). Dan, semua nama kolom yang dulunya diawali dengan angka sekarang memiliki xdi awal.

Jika Anda tidak ingin membuang-buang memori dengan memiliki dua salinan dari dasarnya data yang sama, Anda dapat menghapus sebuah objek R dari sesi bekerja dengan  rm()fungsi: rm(citytable).

Impor data dari paket

Ada beberapa paket yang memungkinkan Anda mengakses data langsung dari R. Salah satunya adalah quantmod, yang memungkinkan Anda untuk menarik beberapa data keuangan dan pemerintah AS langsung ke R.

Yang lainnya adalah paket data cuaca yang diberi nama tepat di CRAN. Itu dapat menarik data dari Weather Underground API, yang memiliki informasi untuk banyak negara di seluruh dunia. 

Paket rnoaa, sebuah proyek dari grup rOpenSci, memanfaatkan beberapa kumpulan data Administrasi Kelautan dan Atmosfer Nasional AS yang berbeda, termasuk informasi iklim, pelampung, dan badai harian.

Jika Anda tertarik dengan data pemerintah negara bagian atau lokal di AS atau Kanada, Anda mungkin ingin melihat RSocrata untuk melihat apakah agensi yang Anda minati memposting data di sana. Saya belum menemukan daftar lengkap dari semua kumpulan data Socrata yang tersedia, tetapi ada halaman pencarian di //www.opendatanetwork.com. Namun, berhati-hatilah: Ada kumpulan yang diupload komunitas bersama dengan data resmi pemerintah, jadi periksa pemilik kumpulan data dan upload sumber sebelum mengandalkannya untuk lebih dari sekadar praktik R. "ODN Dataset" dalam hasil berarti itu adalah file yang diunggah oleh seseorang di masyarakat umum. Kumpulan data resmi pemerintah cenderung berada di URL seperti //data.CityOrStateName.govdan  //data.CityOrStateName.us.

For more data-import packages, see my searchable chart at //bit.ly/RDataPkgs. If you work with US government data, you might be particularly interested in censusapi and tidycensus, both of which tap into US Census Bureau data. Other useful government data packages include eu.us.opendata from the US and European Union governments to make it easier to compare data in both regions, and cancensus for Canadian census data.

When the data’s not ideally formatted

In all these sample data cases, the data has been not only well-formatted, but ideal: Once I found it, it was perfectly structured for R. What do I mean by that? It was rectangular, with each cell having a single value instead of merged cells. And the first row had column headers, as opposed to, say, a title row in large font across multiple cells in order to look pretty—or no column headers at all.

Dealing with untidy data can, unfortunately, get pretty complicated. But there are a couple of common issues that are easy to fix.

Beginning rows that aren’t part of the data. If you know that the first few rows of an Excel spreadsheeet don’t have data you want, you can tell rio to skip one or more lines. The syntax is rio::import("mySpreadsheet.xlsx", skip=3) to exclude the first three rows. skip takes an integer.

There are no column names in the spreadsheet. The default import assumes the first row of your sheet is the column names. If your data doesn’t have headers, the first row of your data may end up as your column headers. To avoid that, use rio::import("mySpreadsheet.xlsx", col_names = FALSE) so R will generate default headers of X0, X1, X2, and so on. Or, use a syntax such as rio::import("mySpreadsheet.xlsx", col_names = c("City", "State", "Population")) to set your own column names.

If there are multiple tabs in your spreadsheet, the which argument overrides the default of reading in the first worksheet. rio::import("mySpreadsheet.xlsx", which = 2) reads in the second worksheet.

What’s a data frame? And what can you do with one?

rio imports a spreadsheet or CSV file as an R data frame. How do you know whether you’ve got a data frame? In the case of snowdata, class(snowdata) returns the class, or type, of object it is. str(snowdata) also tells you the class and adds a bit more information. Much of the info you see with str() is similar to what you saw for this example in the RStudio environment pane: snowdata has 76 observations (rows) and two variables (columns).

Data frames are somewhat like spreadsheets in that they have columns and rows. However, data frames are more structured. Each column in a data frame is an R vector, which means that every item in a column has to be the same data type. One column can be all numbers and another column can be all strings, but within a column, the data has to be consistent.

If you’ve got a data frame column with the values 5, 7, 4, and “value to come,” R will not simply be unhappy and give you an error. Instead, it will coerce all your values to be the same data type. Because “value to come” can’t be turned into a number, 5, 7, and 4 will end up being turned into character strings of "5", "7", and "4". This isn’t usually what you want, so it’s important to be aware of what type of data is in each column. One stray character string value in a column of 1,000 numbers can turn the whole thing into characters. If you want numbers, make sure you have them!

R does have a ways of referring to missing data that won’t screw up the rest of your columns: NA means “not available.”

Bingkai data berbentuk persegi panjang: Setiap baris harus memiliki jumlah entri yang sama (meskipun beberapa bisa kosong), dan setiap kolom harus memiliki jumlah item yang sama.

Kolom spreadsheet Excel biasanya dirujuk dengan huruf: Kolom A, Kolom B, dll. Anda dapat merujuk ke kolom data frame dengan namanya, dengan menggunakan sintaks dataFrameName$columnName. Jadi, jika Anda mengetik snowdata$Totaldan menekan Enter, Anda akan melihat semua nilai di Totalkolom, seperti yang ditunjukkan pada gambar di bawah ini. (Itulah mengapa saat Anda menjalankan str(snowdata)perintah, ada tanda dolar sebelum nama setiap kolom.)

Taylor & Francis Group

A reminder that those bracketed numbers at the left of the listing aren’t part of the data; they’re just telling you what position each line of data starts with. [1] means that line starts with the first item in the vector, [10] the tenth, etc.

RStudio tab completion works with data frame column names as well as object and function names. This is pretty useful to make sure you don’t misspell a column name and break your script—and it also saves typing if you’ve got long column names.

Type snowdata$ and wait, then you see a list of all the column names in snowdata.

It’s easy to add a column to a data frame. Currently, the Total column shows winter snowfall in inches. To add a column showing totals in meters, you can use this format:

snowdata$Meters <- snowdata$Total * 0.0254

The name of the new column is on the left, and there’s a formula on the right. In Excel, you might have used =A2 * 0.0254 and then copied the formula down the column. With a script, you don’t have to worry about whether you’ve applied the formula properly to all the values in the column.

Now look at your snowdata object in the Environment tab. It should have a third variable, Meters.

Because snowdata is a data frame, it has certain data-frame properties that you can access from the command line. nrow(snowdata) gives you the numbers of rows and ncol(snowdata) the number of columns. Yes, you can view this in the RStudio environment to see how many observations and variables there are, but there will probably be times when you’ll want to know this as part of a script. colnames(snowdata) or names(snowdata) gives you the name of snowdata columns. rownames(snowdata) give you any row names (if none were set, it will default to character strings of the row number such as "1", "2", "3", etc.).

Some of these special dataframe functions, also known as methods, not only give you information but let you change characteristics of the data frame. So, names(snowdata) tells you the column names in the data frame, but

names(snowdata) <- c("Winter", "SnowInches", "SnowMeters")

changes the column names in the data frame.

You probably won’t need to know all available methods for a data frame object, but if you’re curious, methods(class=class(snowdata)) displays them. To find out more about any method, run the usual help query with a question mark, such as ?merge or ?subset.

When a number’s not really a number

ZIP codes are a good example of “numbers” that shouldn’t really be treated as such. Although technically numeric, it doesn’t make sense to do things like add two ZIP codes together or take an average of ZIP codes in a community. If you import a ZIP-code column, R will likely turn it into a column of numbers. And if you’re dealing with areas in New England where ZIP codes start with 0, the 0 will disappear.

I have a tab-delineated file of Boston ZIP codes by neighborhood, downloaded from a Massachusetts government agency, at //raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt. If I tried to import it with zips <- rio::import("bostonzips.txt"), the ZIP codes would come in as 2118, 2119, etc. and not 02118, 02119, and so on.

This is where it helps to know a little bit about the underlying function that rio’s import() function uses. You can find those underlying functions by reading the import help file at ?import. For pulling in tab-separated files, import uses either fread() from the data.table package or base R’s read.table() function. The ?read.table help says that you can specify column classes with the colClasses argument.

Create a data subdirectory in your current project directory, then download the bostonzips.txt file with

download.file("//raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt", "data/bostonzips.txt")

If you import this file specifying both columns as character strings, the ZIP codes will come in properly formated:

zips <- rio::import("data/bostonzips.txt", colClasses = c("character”", "character")) str(zips)

Note that the column classes have to be set using the c() function, c("character", "character"). If you tried colClasses, "character", you’d get an error message. This is a typical error for R beginners, but it shouldn’t take long to get into the c() habit.

A save-yourself-some-typing tip: Writing out c("character", "character") isn’t all that arduous; but if you’ve got a spreadsheet with 16 columns where the first 14 need to be character strings, this can get annoying. R’s rep() function can help. rep(), as you might have guessed, repeats whatever item you give it however many times you tell it to, using the format rep(myitem, numtimes). rep("character", 2) is the same as c("character", "character"), so colClasses = rep("character", 2) is equivalent to colClasses = c("character", "character") . And, colClasses = c(rep("character", 14), rep("numeric", 2)) sets the first 14 columns as character strings and the last two as numbers. All the names of column classes here need to be in quotation marks because names are character strings.

I suggest you play around a little with rep() so you get used to the format, since it’s a syntax that other R functions use, too.

Easy sample data

R comes with some built-in data sets that are easy to use if you want to play around with new functions or other programming techniques. They’re also used a lot by people teaching R, since instructors can be sure that all students are starting off with the same data in exactly the same format.

Type data() to see available built-in data sets in base R and whatever installed packages are currently loaded. data(package = .packages(all.available = TRUE)) from base R displays all possible data sets from packages that are installed in your system, whether or not they’re loaded into memory in your current working session.

You can get more information about a data set the same way you get help with functions: ?datasetname or help("datasetname"). mtcars and iris are among those I’ve seen used very often.

If you type mtcars, the entire mtcars data set prints out in your console. You can use the head() function to look at the first few rows with head(mtcars).

You can store that data set in another variable if you want, with a format like cardata <- mtcars.

Or, running the data function with the data set name, such as data(mtcars), loads the data set into your working environment.

One of the most interesting packages with sample data sets for journalists is the fivethirtyeight package, which has data from stories published on the FiveThirtyEight.com website. The package was created by several academics in consultation with FiveThirtyEight editors; it is designed to be a resource for teaching undergraduate statistics.

Prepackaged data can be useful—and in some cases fun. In the real world, though, you may not be using data that’s quite so conveniently packaged.

Create a data frame manually in R

Chances are, you’ll often be dealing with data that starts off outside of R and you import from a spreadsheet, CSV file, API, or other source. But sometimes you might just want to type a small amount of data directly into R, or otherwise create a data frame manually. So let’s take a quick look at how that works.

R data frames are assembled column by column by default, not one row at a time. If you wanted to assemble a quick data frame of town election results, you could create a vector of candidate names, a second vector with their party affiliation, and then a vector of their vote totals:

candidates <- c("Smith", "Jones", "Write-ins", "Blanks")

party <- c("Democrat", "Republican", "", "")

votes <- c(15248, 16723, 230, 5234)

Remember not to use commas in your numbers, like you might do in Excel.

To create a data frame from those columns, use the data.frame() function and the synatx data.frame(column1, column2, column3).

myresults <- data.frame(candidates, party, votes)

Check its structure with str():

str(myresults)

While the candidates and party vectors are characters, the candidates and party data frame columns have been turned into a class of R objects called factors. It’s a bit too in-the-weeds at this point to delve into how factors are different from characters, except to say that

  1. Factors can be useful if you want to order items in a certain, nonalphabetical way for graphing and other purposes, such as Poor is less than Fair is less than Good is less than Excellent.
  2. Factors can behave differently than you might expect at times. I recommend sticking with character strings unless you have a good reason to specifically want factors.

You can keep your character strings intact when creating data frames by adding the argument stringsAsFactors = FALSE:

myresults <- data.frame(candidates, party, votes, stringsAsFactors = FALSE) str(myresults)

Now, the values are what you expected.

There’s one more thing I need to warn you about when creating data frames this way: If one column is shorter than the other(s), R will sometimes repeat data from the shorter column—whether or not you want that to happen.

Say, for example, you created the election results columns for candidates and party but only entered votes results for Smith and Jones, not for Write-ins and Blanks. You might expect the data frame would show the other two entries as blank, but you’d be wrong. Try it and see, by creating a new votes vector with just two numbers, and using that new votes vector to create another data frame:

votes <- c(15248, 16723)

myresults2 <- data.frame(candidates, party, votes)

str(myresults2)

That’s right, R reused the first two numbers, which is definitely not what you’d want. If you try this with three numbers in the votes vector instead of two or four, R would throw an error. That’s because each entry couldn’t be recycled the same number of times.

If by now you’re thinking, “Why can’t I create data frames that don’t change strings into factors automatically? And why do I have to worry about data frames reusing one column’s data if I forget to complete all the data?” Hadley Wickham had the same thought. His tibble package creates an R class, also called tibble, that he says is a “modern take on data frames. They keep the features that have stood the test of time, and drop the features that used to be convenient but are now frustrating.”

If this appeals to you, install the tibble package if it’s not on your system and then try to create a tibble with

myresults3 <- tibble::tibble(candidates, party, votes)

and you’ll get an error message that the votes column needs to be either 4four items long or one item long (tibble() will repeat a single item as many times as needed, but only for one item).

Put the votes column back to four entries if you’d like to create a tibble with this data:

library(tibble)

votes <- c(15248, 16723, 230, 5234)

myresults3 <- tibble(candidates, party, votes)

str(myresults3)

It looks similar to a data frame—in fact, it is a data frame, but with some special behaviors, such as how it prints. Also notice that the candidates column is character strings, not factors.

If you like this behavior, go ahead and use tibbles. However, given how prevelant conventional data frames remain in R, it’s still important to know about their default behaviors.

Exporting data

Often after you’ve wrangled your data in R, you want to save your results. Here are some of the ways to export your data that I tend to use most:

Save to a CSV file with rio::export(myObjectName, file="myFileName.csv") and to an Excel file with rio::export(myObjectName, file="myFileName.xlsx"). rio understands what file format you want based on the extension of the file name. There are several other available formats, including .tsv for tab-separated data, .json for JSON, and .xml for XML.

Save to an R binary object that makes it easy to load back into R in future sessions. There are two options.

Generic save() saves one or more objects into a file, such as save(objectName1, objectName2, file="myfilename.RData"). To read this data back into R, you just use the command load("myfilename.RData") and all the objects return with the same names in the same state they had before.

You can also save a single object into a file with saveRDS(myobject, file="filename.rds"). The logical assumption is that loadRDS would read the file back in, but instead the command is readRDS—and in this case, just the data has been stored, not the object name. So, you need to read the data into a new object name, such as mydata <- readRDS("filename.rds").

There’s a third way of saving an R object specifically for R: generating the R commands that would recreate the object instead of the object with final results. The base R functions for generating an R file to recreate an object are dput() or dump(). However, I find rio::export(myobject, "mysavedfile.R") even easier to remember.

Finally, there are additional ways to save files that optimize for readability, speed, or compression, which I mention in the additional resources section at the end of this article.

You can also export an R object into your Windows or Mac clipboard with rio: rio::export(myObjectName, format). And, you can import data into R from your clipboard the same way: rio::import(file).

Bonus: rio’s convert() function lets you—you guessed it—convert one file type to another without having to manually pull the data into and then out of R. See ?convert for more info.

Final point: RStudio lets you click to import a file, without having to write code at all. This isn’t something I recommend until you’re comfortable importing from the command line, beause I think it’s important to understand the code behind importing. But, I admit this can be a handy shortcut.

In the Files tab of RStudio’s lower right pane, navigate to the file you want to import and click it. You’ll see an option to either View File or Import Dataset. Choose Import Dataset to see a dialog that previews the data, lets you modify how the data is imported, and previews the code that will be generated.

Make whatever changes you want and click Import, and your data will be pulled into R.

Additional resources

rio alternatives. While rio is a great Swiss Army knife of file handling, there may be times when you want a bit more control over how your data is pulled into or saved out of R. In addition, there have been times when I’ve had a challenging data file that rio choked on but another package could handle it. Some other functions and packages you may want to explore:

  • Base R’s read.csv() and read.table() to import text files (use ?read.csv and ?read.table to get more information). stringsAsFactors = FALSE is needed with these if you want to keep your character strings as character strings. write.csv() saves to CSV.
  • rio uses Hadley Wickham’s readxl package for reading Excel files. Another alternative for Excel is openxlsx, which can write to an Excel file as well as read one. Look at the openxlsx package vignettes for information about formatting your spreadsheets as you export.
  • Wickham’s readr package is also worth a look as part of the “tidyverse.” readr includes functions to read CSV, tab-separated, fixed-width, web logs, and several other types of files. readr prints out the type of data it has determined for each column—integer, character, double (non-whole numbers), etc. It creates tibbles.

Import directly from a Google spreadsheet. The googlesheets package lets you import data from a Google Sheets spreadsheet, even if it’s private, by authenticating your Google account. The package is available on CRAN; install it via install.packages("googlesheets"). After loading it with library("googlesheets"), read the excellent introductory vignette. At the time of this writing, the intro vignette was available in R at vignette("basic-usage", package="googlesheets"). If you don’t see it, try help(package="googlesheets") and click the User Guides, Package Vignettes and Other Documentation link for available vignettes, or look at the package information on GitHub at //github.com/jennybc/googlesheets.

Scrape data from Web pages with the rvest package and SelectorGadget browser extension or JavaScript bookmarklet. SelectorGadget helps you discover the CSS elements of data you want to copy that are on an HTML page; then rvest uses R to find and save that data. This is not a technique for raw beginners, but once you’ve got some R experience under your belt, you may want to come back and revisit this. I have some instructions and a video on how to do this at //bit.ly/Rscraping. RStudio has a webinar available on demand as well.

Alternatives to base R’s save and read functions. If you are working with large data sets, speed may become important to you when saving and loading files. The data.table package has a speedy fread() function, but beware that resulting objects are data.tables and not plain data frames; some behaviors are different. If you want a conventional data frame, you can get one with the as.data.frame(mydatatable) syntax. The data.table package’s fwrite() function is aimed at writing to a CSV file considerably faster than base R’s write.csv().

Dua paket lain mungkin menarik untuk menyimpan dan mengambil data. Paket bulu disimpan dalam format biner yang dapat dibaca ke R atau Python. Dan, paket pertama read.fst()dan write.fst()menawarkan penyimpanan dan pemuatan objek bingkai data R dengan cepat — plus opsi kompresi file.