Tutorial R: Cara mengimport data ke R

Dapatkan buku yang lengkap
Praktikal R untuk Komunikasi Massa dan Kewartawanan MSRP $ 59.95 Lihatnya

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

Sebelum anda dapat menganalisis dan memvisualisasikan data, anda harus memasukkan data tersebut ke dalam R. Terdapat pelbagai cara untuk melakukannya, bergantung pada bagaimana data anda diformat dan di mana ia berada.

Biasanya, fungsi yang anda gunakan untuk mengimport data bergantung pada format fail data. Di pangkalan R, sebagai contoh, anda boleh mengimport fail CSV dengan read.csv(). Hadley Wickham membuat pakej bernama readxl yang, seperti yang anda jangkakan, mempunyai fungsi untuk dibaca dalam fail Excel. Terdapat satu lagi pakej, googlesheets, untuk menarik data dari hamparan Google.

Tetapi jika anda tidak mahu mengingat semua itu, ada rio.

Keajaiban rio

"Tujuan rio adalah membuat file data I / O [import / output] dalam R semudah mungkin dengan menerapkan tiga fungsi sederhana dalam gaya pisau Swiss-tentara," menurut halaman proyek GitHub. Fungsi-fungsi itu adalah import(), export(), dan convert().

Jadi, pakej rio yang mempunyai hanya satu fungsi untuk membaca dalam pelbagai jenis fail: import(). Sekiranya anda import("myfile.csv"), ia tahu menggunakan fungsi untuk membaca fail CSV. import("myspreadsheet.xlsx")berfungsi dengan cara yang sama. Sebenarnya, rio mengendalikan lebih daripada dua lusin format termasuk data yang dipisahkan tab (dengan pelanjutan .tsv), JSON, Stata, dan data format lebar tetap (.fwf).

Pakej yang diperlukan untuk tutorial ini

  • rio
  • htmltab
  • bacaxl
  • googlesheets
  • pacman
  • pegawai kebersihan
  • rmiscutils (pm GitHub) atau readr
  • penaik

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

Sekiranya anda belum mempunyai pakej rio pada sistem anda, pasang sekarang dengan install.packages("rio").

Saya telah menyediakan beberapa contoh data dengan data salji musim sejuk di Boston. Anda boleh menuju ke //bit.ly/BostonSnowfallCSV dan klik kanan untuk menyimpan fail tersebut sebagai BostonWinterSnowfalls.csv dalam direktori kerja projek R semasa anda. Tetapi salah satu titik penulisan skrip adalah untuk mengganti karya manual - membosankan atau sebaliknya - dengan automasi yang mudah dihasilkan semula. Daripada mengklik untuk memuat turun, anda boleh menggunakan download.filefungsi R dengan sintaks download.file("url", "destinationFileName.csv"):

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

Ini mengandaikan bahawa sistem anda akan mengalihkan dari pintasan URL Bit.ly itu dan berjaya mencari URL fail sebenar, //raw.githubusercontent.com/smach/NICAR15data/master/BostonWinterSnowfalls.csv. Saya kadang-kadang menghadapi masalah mengakses kandungan web pada PC Windows lama. Sekiranya anda mempunyai salah satu dan pautan Bit.ly ini tidak berfungsi, anda boleh menukar URL sebenar untuk pautan Bit.ly. Pilihan lain adalah menaik taraf PC Windows anda ke Windows 10 jika mungkin untuk melihat apakah itu berjaya.

Sekiranya anda mahu rio itu hanya dapat mengimport data secara langsung dari URL, sebenarnya ia boleh, dan saya akan sampai di bahagian seterusnya. Inti dari bahagian ini adalah membuat latihan bekerja dengan fail tempatan.

Sebaik sahaja anda mempunyai fail ujian pada sistem tempatan anda, anda dapat memuatkan data tersebut ke dalam objek R yang disebut snowdata dengan kod:

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

Perhatikan bahawa kemungkinan rio akan meminta anda memuat turun semula fail dalam format binari, dan anda perlu menjalankannya

muat turun.file ("// bit.ly/BostonSnowfallCSV", "BostonWinterSnowfalls.csv", mode = "wb")

Pastikan anda menggunakan pilihan penyelesaian tab RStudio. Sekiranya anda menaip rio::dan menunggu, anda akan mendapat senarai semua fungsi yang ada. Ketik snowdan tunggu, dan anda akan melihat nama penuh objek anda sebagai pilihan. Gunakan kekunci anak panah atas dan bawah anda untuk beralih antara cadangan penyelesaian automatik. Setelah pilihan yang anda mahukan diserlahkan, tekan kekunci Tab (atau Enter) untuk menambahkan nama objek atau fungsi penuh ke skrip anda.

Anda harus melihat objek snowdatamuncul di tab persekitaran anda di panel kanan atas RStudio. (Jika panel kanan atas menunjukkan Sejarah perintah anda dan bukannya Alam Sekitar anda, pilih tab Lingkungan.)

Kumpulan Taylor & Francis

snowdataharus menunjukkan bahawa ia mempunyai 76 "obs." - pemerhatian, atau baris - dan dua pemboleh ubah, atau lajur. Sekiranya anda mengklik anak panah di sebelah kiri snowdatauntuk mengembangkan senarai, anda akan melihat dua nama lajur dan jenis data yang disimpan setiap lajur. Yang Winteradalah rentetan aksara dan Totallajur adalah angka. Anda juga harus dapat melihat beberapa nilai pertama setiap lajur di panel Lingkungan.

Kumpulan Taylor & Francis

Klik pada perkataan snowdataitu sendiri di tab Lingkungan untuk paparan data anda yang lebih mirip spreadsheet. Anda boleh mendapatkan paparan yang sama dari konsol R dengan arahan View(snowdata)(yang harus menjadi modal V pada Tampilan - viewtidak akan berfungsi). Catatan: snowdatatidak terdapat tanda petik kerana anda merujuk pada nama objek R di persekitaran anda. Dalam rio::importperintah sebelumnya, BostonWinterSnowfalls.csv terdapat tanda petik kerana itu bukan objek R; itu nama rentetan watak fail di luar R.

Kumpulan Taylor & Francis

Pandangan ini mempunyai beberapa tingkah laku seperti hamparan. Klik tajuk lajur untuk menyusunnya mengikut nilai lajur tersebut mengikut urutan menaik; klik tajuk lajur yang sama kali kedua untuk menyusun mengikut turutan menurun. Terdapat kotak carian untuk mencari baris yang sepadan dengan watak tertentu.

Sekiranya anda mengklik ikon Penapis, anda akan mendapat penapis untuk setiap lajur. The Winterlajur watak berfungsi seperti yang anda jangkakan, penapisan bagi apa-apa baris yang mengandungi aksara yang anda taip. Jika anda klik pada Totalpenapis lajur berangka, walaupun, versi yang lebih lama RStudio menunjukkan gelangsar manakala yang lebih baru menunjukkan histogram dan kotak untuk penapisan .

Import fail dari web

Sekiranya anda ingin memuat turun dan mengimport fail dari web, anda boleh melakukannya jika tersedia untuk umum dan dalam format seperti Excel atau CSV. Cuba

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

Banyak sistem dapat mengikuti URL pengalihan ke fail walaupun setelah pertama kali memberi anda mesej ralat, asalkan anda menentukan formatnya "csv"kerana nama fail di sini tidak termasuk .csv. Sekiranya anda tidak berfungsi, gunakan URL //raw.githubusercontent.com/smach/R4JournalismBook/master/data/BostonSnowfall.csv sebagai gantinya.

rio juga dapat mengimport jadual HTML berformat baik dari laman web, tetapi jadual harus diformat dengan sangat baik. Katakan anda mahu memuat turun jadual yang menerangkan penilaian keterukan Perkhidmatan Cuaca Nasional untuk ribut salji. Halaman National Center for Environmental Information Regional Snowfall Index hanya mempunyai satu jadual, dibuat dengan sangat baik, jadi kod seperti ini harus berfungsi:

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

Perhatikan sekali lagi bahawa anda perlu memasukkan format, dalam kes ini format="html". kerana URL itu sendiri tidak memberikan petunjuk apa jenis fail itu. Sekiranya URL menyertakan nama fail dengan .htmlpeluasan, rio akan tahu.

Namun, dalam kehidupan nyata, data Web jarang muncul dalam bentuk terasing dan kemas. Pilihan yang baik untuk kes yang tidak dibuat dengan baik adalah pakej htmltab. Pasang dengan install.packages("htmltab"). Fungsi pakej untuk membaca jadual HTML juga disebut htmltab. Tetapi jika anda menjalankan ini:

perpustakaan (htmltab) meja bandar <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population") str (meja bandar)

anda melihat bahawa anda tidak mempunyai jadual yang betul, kerana kerangka data mengandungi satu objek. Kerana saya tidak menentukan jadual mana , ia menarik jadual HTML pertama di halaman. Itu tidak menjadi yang saya mahukan. Saya tidak mahu mengimport setiap jadual di halaman sehingga saya menemui yang betul, tetapi untungnya saya mempunyai sambungan Chrome yang disebut Table Capture yang membolehkan saya melihat senarai jadual di halaman.

Kali terakhir saya memeriksa, jadual 5 dengan lebih daripada 300 baris adalah jadual yang saya mahukan. Sekiranya itu tidak berfungsi untuk anda sekarang, cuba pasang Table Capture pada penyemak imbas Chrome untuk memeriksa jadual yang ingin anda muat turun.

Saya akan mencuba lagi, menentukan jadual 5 dan kemudian melihat nama lajur apa yang terdapat di meja bandar baru. Perhatikan bahawa dalam kod berikut, saya meletakkan citytable <- htmltab()perintah ke beberapa baris. Oleh itu, ia tidak melampaui batas - anda boleh menyimpan semuanya dalam satu baris. Sekiranya nombor jadual telah berubah sejak artikel ini diposkan, ganti which = 5dengan nombor yang betul.

Daripada menggunakan halaman di Wikipedia, anda boleh mengganti URL Wikipedia dengan URL salinan fail yang saya buat. Fail itu terdapat di //bit.ly/WikiCityList. Untuk menggunakan versi, jenis bit.ly/WikiCityListke dalam pelayar, kemudian salin URL yang panjang ia pelencongan dan penggunaan yang bukannya URL Wikipedia kod di bawah:

perpustakaan (htmltab) meja bandar <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population", yang = 5) nama panggilan (citytable)

Bagaimana saya tahu whichadalah hujah yang saya perlukan untuk menentukan nombor jadual? Saya membaca htmltabfail bantuan menggunakan arahan ?htmltab. Itu termasuk semua hujah yang ada. Saya mengimbas kemungkinan, dan " whichvektor panjang untuk mengenal pasti jadual dalam dokumen" kelihatan tepat.

Perhatikan juga, yang saya gunakan colnames(citytable)bukan names(citytable)untuk melihat nama lajur. Sama ada akan berfungsi. Base R juga mempunyai  rownames()fungsi.

Bagaimanapun, hasil jadual itu jauh lebih baik, walaupun anda dapat melihat str(citytable)bahawa beberapa lajur yang seharusnya berupa angka masuk sebagai rentetan watak. Anda dapat melihatnya di chrsebelah nama lajur dan tanda petikan di sekitar nilai seperti 8,550,405.

Ini adalah salah satu gangguan kecil R: R umumnya tidak memahami bahawa itu 8,550adalah nombor. Saya menangani masalah ini sendiri dengan menulis fungsi saya sendiri dalam pakej rmiscutils saya sendiri untuk mengubah semua "rentetan watak" yang benar-benar nombor dengan koma kembali menjadi angka. Sesiapa sahaja boleh memuat turun pakej dari GitHub dan menggunakannya.

Cara paling popular untuk memasang pakej dari GitHub adalah menggunakan pakej yang disebut devtools. devtools adalah pakej yang sangat hebat yang direka kebanyakannya untuk orang yang ingin menulis pakej mereka sendiri , dan ini merangkumi beberapa cara untuk memasang pakej dari tempat lain selain CRAN. Walau bagaimanapun, devtools biasanya memerlukan beberapa langkah tambahan untuk dipasang berbanding dengan pakej biasa, dan saya ingin meninggalkan tugas-tugas pentadbir sistem yang mengganggu sehingga benar-benar diperlukan.

Namun, pacman juga memasang pakej dari sumber bukan CRAN seperti GitHub. Sekiranya belum, pasang pacman denganinstall.packages("pacman").

p_install_gh("username/packagerepo")Fungsi pacman dipasang dari repo GitHub.

p_load_gh("username/packagerepo")memuatkan pakej ke dalam memori jika sudah ada di sistem anda, dan ia mula-mula dipasang kemudian memuatkan pakej dari GitHub jika paket itu tidak ada di dalam negara.

Pakej utiliti rmisc saya boleh didapati di smach/rmiscutils. Jalankan pacman::p_load_gh("smach/rmiscutils")untuk memasang pakej rmiscutils saya.

Catatan: Pakej alternatif untuk memasang pakej dari GitHub disebut alat kawalan jauh, yang boleh anda pasangkan  install.packages("remotes"). Tujuan utamanya adalah memasang pakej dari repositori jauh seperti GitHub. Anda boleh melihat fail bantuan dengan help(package="remotes").

Dan, mungkin yang paling licin adalah pakej yang dipanggil githubinstall. Ini bertujuan untuk meneka repo di mana pakej berada. Pasang melalui  install.packages("githubinstall"); maka anda boleh memasang pakej rmiscutils saya menggunakan  githubinstall::gh_install_packages("rmiscutils"). Anda akan ditanya apakah anda ingin memasang pakej di smach/rmisutils(anda lakukan)

Setelah anda memasang koleksi fungsi saya, anda boleh menggunakan number_with_commas()fungsi saya untuk mengubah rentetan watak yang seharusnya menjadi nombor kembali menjadi angka. Saya sangat menyarankan untuk menambahkan lajur baru ke kerangka data dan bukannya mengubah lajur yang ada — itu adalah amalan analisis data yang baik tidak kira platform apa yang anda gunakan.

Dalam contoh ini, saya akan memanggil lajur baru PopEst2017. (Jika jadual telah diperbaharui sejak itu, gunakan nama lajur yang sesuai.)

perpustakaan (rmiscutils) meja bandar $ PopEst2017 <- number_with_commas (anggaran bandar raya $ `2017 anggaran ')

Pakej rmiscutils saya bukan satu-satunya cara untuk menangani nombor import yang mempunyai koma. Setelah saya membuat pakej rmiscutils dan number_with_commas()fungsinya, lahirlah pakej read-tidyverse. readr juga termasuk fungsi yang tali bertukar watak menjadi nombor, parse_number().

Setelah memasang readr, anda dapat menjana nombor dari lajur anggaran 2017 dengan readr:

meja bandar $ PopEst2017 <- readr :: parse_number (anggaran bandar raya $ `2017 anggaran ')

Satu kelebihannya readr::parse_number()ialah anda dapat menentukan sendiri locale()untuk mengawal perkara seperti pengekodan dan tanda perpuluhan, yang mungkin menarik bagi pembaca yang bukan dari AS. Jalankan ?parse_number untuk maklumat lebih lanjut.

Catatan: Sekiranya anda tidak menggunakan penyelesaian tab untuk lajur anggaran 2017, anda mungkin menghadapi masalah dengan nama lajur itu jika terdapat ruang di dalamnya semasa anda menjalankan kod ini. Dalam kod saya di atas, perhatikan terdapat tanda petik tunggal ( `) di sekitar nama lajur. Itu kerana nama yang ada memiliki ruang di dalamnya, yang tidak seharusnya Anda miliki di R. Nama lajur itu mempunyai masalah lain: Ia bermula dengan angka, juga umumnya R no-no. RStudio mengetahui perkara ini, dan secara automatik menambahkan petikan balik yang diperlukan di sekitar nama dengan pelengkap automatik tab.

Petua bonus: Terdapat pakej R (tentu saja ada!) Yang disebut petugas kebersihan yang secara automatik dapat memperbaiki nama lajur yang menyusahkan yang diimport dari sumber data yang tidak mesra R. Pasang dengan install.packages("janitor"). Kemudian, anda boleh membuat nama lajur bersih baru menggunakan clean_names()fungsi petugas kebersihan .

Sekarang, saya akan membuat kerangka data yang sama sekali baru dan bukannya mengubah nama lajur pada kerangka data asal saya, dan menjalankan clean_names () janitor pada data asal. Kemudian, periksa nama lajur bingkai data dengan names():

citytable_cleaned <- janitor :: clean_names (bandar meja)

nama (citytable_cleaned)

Anda melihat ruang telah diubah menjadi garis bawah, yang sah dalam nama pemboleh ubah R (seperti noktah). Dan, semua nama lajur yang dulunya dimulakan dengan angka sekarang ada xdi awal.

Jika anda tidak mahu membuang memori dengan mempunyai dua salinan dasarnya data yang sama, anda boleh mengeluarkan objek R dari sesi kerja anda dengan  rm()fungsi: rm(citytable).

Import data dari pakej

Terdapat beberapa pakej yang membolehkan anda mengakses data secara langsung dari R. Salah satunya adalah quantmod, yang membolehkan anda menarik beberapa data kerajaan dan kewangan AS terus ke R.

Satu lagi adalah pakej Weatherdata bernama CRAN yang tepat. Ia dapat menarik data dari Weather Underground API, yang mempunyai maklumat untuk banyak negara di seluruh dunia. 

Pakej rnoaa, sebuah projek dari kumpulan rOpenSci, merangkumi beberapa kumpulan data Pentadbiran Lautan dan Atmosfera Negara AS yang berbeza, termasuk maklumat iklim, pelampung, dan ribut harian.

Sekiranya anda berminat dengan data pemerintah negeri atau daerah di AS atau Kanada, anda mungkin ingin menyemak RSocrata untuk melihat apakah agensi yang anda minati memposting data di sana. Saya belum menemui senarai lengkap semua set data Socrata yang tersedia, tetapi ada halaman carian di //www.opendatanetwork.com. Hati-hati, walaupun: Terdapat kumpulan yang dimuat naik oleh masyarakat bersama dengan data rasmi pemerintah, jadi periksa pemilik kumpulan data dan muat naik sumber sebelum bergantung padanya untuk lebih dari sekadar latihan R Hasil "Dataset ODN" bermaksud fail yang dimuat naik oleh seseorang di masyarakat umum. Kumpulan data rasmi kerajaan cenderung tinggal di URL seperti //data.CityOrStateName.govdan  //data.CityOrStateName.us.

Untuk lebih banyak pakej import data, lihat carta saya yang boleh dicari di //bit.ly/RDataPkgs. Sekiranya anda bekerja dengan data pemerintah AS, anda mungkin sangat berminat dengan banci dan tidikensus, yang keduanya memanfaatkan data Biro Banci AS. Pakej data kerajaan lain yang berguna termasuk eu.us.opendata dari pemerintah AS dan Kesatuan Eropah untuk memudahkan membandingkan data di kedua-dua wilayah, dan pembatalan untuk data banci Kanada.

Apabila data tidak diformat dengan ideal

Dalam semua kes data sampel ini, data tidak hanya diformat dengan baik, tetapi juga ideal: Setelah saya dapati, data tersebut disusun dengan sempurna untuk R. Apa yang saya maksudkan dengan itu? Ia berbentuk segi empat, dengan setiap sel mempunyai nilai tunggal dan bukannya sel yang digabungkan. Dan baris pertama mempunyai tajuk lajur, bertentangan dengan, katakanlah, baris judul dalam font besar di beberapa sel agar kelihatan cantik — atau tidak ada tajuk lajur sama sekali.

Sayangnya, berurusan dengan data yang tidak kemas dapat menjadi sangat rumit. Tetapi ada beberapa masalah umum yang mudah diselesaikan.

Baris permulaan yang bukan sebahagian daripada data. Sekiranya anda tahu bahawa beberapa baris pertama spreadsheet Excel tidak mempunyai data yang anda mahukan, anda boleh memberitahu rio untuk melangkau satu atau lebih baris. Sintaksnya adalah rio::import("mySpreadsheet.xlsx", skip=3)untuk mengecualikan tiga baris pertama. skipmengambil bilangan bulat.

Tidak ada nama lajur dalam hamparan. Import lalai menganggap baris pertama helaian anda adalah nama lajur. Sekiranya data anda tidak mempunyai tajuk, baris pertama data anda mungkin berakhir sebagai tajuk lajur anda. Untuk mengelakkannya, gunakan rio::import("mySpreadsheet.xlsx", col_names = FALSE)begitu R akan menghasilkan header lalai X0, X1, X2, dan sebagainya. Atau, gunakan sintaks seperti rio::import("mySpreadsheet.xlsx", col_names = c("City", "State", "Population"))untuk menetapkan nama lajur anda sendiri.

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 segi empat tepat: Setiap baris harus mempunyai jumlah entri yang sama (walaupun beberapa baris kosong), dan setiap lajur harus mempunyai jumlah item yang sama.

Lajur spreadsheet Excel biasanya disebut dengan huruf: Kolom A, Lajur B, dll. Anda boleh merujuk pada lajur kerangka data dengan namanya, dengan menggunakan sintaks dataFrameName$columnName. Jadi, jika anda menaip snowdata$Totaldan menekan Enter, anda akan melihat semua nilai di Totallajur, seperti yang ditunjukkan pada gambar di bawah. (Itulah sebabnya ketika anda menjalankan str(snowdata)perintah, ada tanda dolar sebelum nama setiap lajur.)

Kumpulan Taylor & Francis

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 pakej lain mungkin menarik untuk menyimpan dan mengambil data. Pakej bulu disimpan dalam format binari yang boleh dibaca sama ada ke dalam R atau Python. Dan, paket pertama read.fst()dan write.fst()menawarkan penjimatan cepat dan pemuatan objek bingkai data R - ditambah dengan pilihan pemampatan fail.