Samouczek R: Jak importować dane do R

Zdobądź całą książkę
Practical R for Mass Communication and Journalism Sugerowana cena detaliczna 59,95 USD Zobacz

Ten artykuł pochodzi z „Practical R for Mass Communication and Journalism” za zgodą wydawcy. © 2019 Taylor & Francis Group, LLC.

Zanim będziesz mógł analizować i wizualizować dane, musisz przenieść te dane do R. Istnieją różne sposoby, aby to zrobić, w zależności od tego, jak są sformatowane i gdzie się znajdują.

Zwykle funkcja używana do importowania danych zależy od formatu pliku danych. Na przykład w podstawowym R możesz zaimportować plik CSV z rozszerzeniem read.csv(). Hadley Wickham stworzył pakiet o nazwie readxl, który, jak można się było spodziewać, ma funkcję odczytu w plikach Excel. Istnieje inny pakiet, arkusze Google, do pobierania danych z arkuszy kalkulacyjnych Google.

Ale jeśli nie chcesz tego wszystkiego pamiętać, jest rio.

Magia Rio

„Celem rio jest uczynienie wejścia / wyjścia [importu / wyjścia] pliku danych w R tak prostym, jak to tylko możliwe, poprzez zaimplementowanie trzech prostych funkcji w stylu szwajcarskiego scyzoryka” - czytamy na stronie projektu GitHub. Funkcje te są import(), export()i convert().

Tak, pakiet rio ma tylko jedną funkcję, aby przeczytać w wielu różnych typów plików: import(). Jeśli tak import("myfile.csv"), to wie, jak używać funkcji do odczytu pliku CSV. import("myspreadsheet.xlsx")działa w ten sam sposób. W rzeczywistości rio obsługuje ponad dwa tuziny formatów, w tym dane rozdzielane tabulatorami (z rozszerzeniem .tsv), JSON, Stata i dane w formacie o stałej szerokości (.fwf).

Pakiety potrzebne do tego samouczka

  • Rio
  • htmltab
  • readxl
  • arkusze Google
  • pacman
  • dozorca
  • rmiscutils (pm GitHub) lub readr
  • tibble

Po przeanalizowaniu danych, jeśli chcesz zapisać wyniki w formacie CSV, arkuszu kalkulacyjnym Excel lub innym formacie, export()funkcja rio może sobie z tym poradzić.

Jeśli nie masz jeszcze pakietu rio w swoim systemie, zainstaluj go teraz z install.packages("rio").

Ustawiłem kilka przykładowych danych z danymi dotyczącymi opadów śniegu w Bostonie. Możesz przejść do //bit.ly/BostonSnowfallCSV i kliknąć prawym przyciskiem myszy, aby zapisać plik jako BostonWinterSnowfalls.csv w bieżącym katalogu roboczym projektu R. Ale jednym z punktów tworzenia skryptów jest zastąpienie pracy ręcznej - żmudnej lub innej - automatyzacją, która jest łatwa do odtworzenia. Zamiast klikać, aby pobrać, możesz użyć download.filefunkcji R ze składnią download.file("url", "destinationFileName.csv"):

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

Zakłada się, że twój system przekieruje z tego skrótu URL Bit.ly i pomyślnie znajdzie prawdziwy adres URL pliku, //raw.githubusercontent.com/smach/NICAR15data/master/BostonWinterSnowfalls.csv. Czasami miałem problemy z dostępem do treści internetowych na starych komputerach z systemem Windows. Jeśli masz jeden z nich, a ten link Bit.ly nie działa, możesz zamienić rzeczywisty adres URL na łącze Bit.ly. Inną opcją jest uaktualnienie komputera z systemem Windows do systemu Windows 10, jeśli to możliwe, aby sprawdzić, czy to wystarczy.

Jeśli chcesz, aby rio mogło po prostu zaimportować dane bezpośrednio z adresu URL, w rzeczywistości może, i przejdę do tego w następnej sekcji. Celem tej sekcji jest poćwiczenie pracy z plikiem lokalnym.

Mając plik testowy w systemie lokalnym, możesz załadować te dane do obiektu R o nazwie snowdata z kodem:

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

Zauważ, że możliwe jest, że rio poprosi Cię o ponowne pobranie pliku w formacie binarnym, w takim przypadku będziesz musiał uruchomić

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

Upewnij się, że używasz opcji uzupełniania kart w RStudio. Jeśli napiszesz rio::i zaczekasz, otrzymasz listę wszystkich dostępnych funkcji. Wpisz snowi poczekaj, a jako opcja powinna pojawić się pełna nazwa obiektu. Użyj klawiszy strzałek w górę iw dół, aby przechodzić między sugestiami automatycznego uzupełniania. Po podświetleniu żądanej opcji naciśnij klawisz Tab (lub Enter), aby dodać pełną nazwę obiektu lub funkcji do skryptu.

Obiekt powinien snowdatapojawić się na karcie środowiska w prawym górnym okienku RStudio. (Jeśli ten prawy górny panel wyświetla historię poleceń zamiast środowiska, wybierz kartę Środowisko).

Grupa Taylor & Francis

snowdatapowinno pokazać, że ma 76 „obs.” - obserwacji lub wierszy - i dwie zmienne lub kolumny. Jeśli klikniesz strzałkę po lewej stronie, snowdataaby rozwinąć listę, zobaczysz nazwy dwóch kolumn i typ danych przechowywanych w każdej z nich. To Winterciągi znaków, a Totalkolumna jest numeryczna. Powinieneś także być w stanie zobaczyć kilka pierwszych wartości każdej kolumny w okienku Środowisko.

Grupa Taylor & Francis

Kliknij snowdatasamo słowo na karcie Środowisko, aby wyświetlić dane bardziej przypominające arkusz kalkulacyjny. Możesz uzyskać ten sam widok z konsoli R za pomocą polecenia View(snowdata)(to musi być duże V w widoku - viewnie zadziała). Uwaga: snowdatanie jest w cudzysłowie, ponieważ odwołujesz się do nazwy obiektu R w swoim środowisku. W poprzednim rio::importpoleceniu BostonWinterSnowfalls.csv znajduje się w cudzysłowie, ponieważ nie jest to obiekt języka R; jest to nazwa ciągu znaków pliku poza R.

Grupa Taylor & Francis

Ten widok ma kilka zachowań podobnych do arkuszy kalkulacyjnych. Kliknij nagłówek kolumny, aby posortować je według wartości tej kolumny w kolejności rosnącej; kliknij ten sam nagłówek kolumny po raz drugi, aby posortować w porządku malejącym. Istnieje pole wyszukiwania, aby znaleźć wiersze pasujące do określonych znaków.

Jeśli klikniesz ikonę Filtruj, otrzymasz filtr dla każdej kolumny. WinterKolumna postać działa jak można się spodziewać, filtrowanie za wiersze, które zawierają znaki wpisać. Jeśli kliknij w Totalfiltrze kolumny numerycznego, choć starsze wersje RStudio pokazać suwak, natomiast nowsze wyświetlić histogram i pole do filtrowania .

Zaimportuj plik z Internetu

Jeśli chcesz pobrać i zaimportować plik z sieci, możesz to zrobić, jeśli jest on publicznie dostępny w formacie takim jak Excel lub CSV. Próbować

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

Wiele systemów może śledzić adres URL przekierowania do pliku nawet po pierwszym wyświetleniu komunikatu o błędzie, o ile określisz format, "csv"ponieważ nazwa pliku tutaj nie zawiera .csv. Jeśli Twój nie zadziała, użyj adresu URL //raw.githubusercontent.com/smach/R4JournalismBook/master/data/BostonSnowfall.csv.

rio może również importować dobrze sformatowane tabele HTML ze stron internetowych, ale tabele muszą być bardzo dobrze sformatowane. Załóżmy, że chcesz pobrać tabelę opisującą wskaźniki nasilenia burz śnieżnych przez National Weather Service. Strona z indeksem opadów śniegu w Krajowych Centrach Informacji Środowiskowej ma tylko jedną tabelę, bardzo dobrze przygotowaną, więc kod taki powinien działać:

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

Zwróć uwagę, że w tym przypadku musisz dołączyć format format="html". ponieważ sam adres URL nie wskazuje, jakiego rodzaju jest to plik. Jeśli adres URL zawierałby nazwę pliku z .htmlrozszerzeniem, rio by wiedział.

Jednak w rzeczywistości dane internetowe rzadko pojawiają się w tak uporządkowanej, odizolowanej formie. Dobrym rozwiązaniem dla przypadków, które nie są tak dobrze wykonane, jest często pakiet htmltab. Zainstaluj go z install.packages("htmltab"). Funkcja pakietu do czytania tabeli HTML jest również nazywana htmltab. Ale jeśli uruchomisz to:

library (htmltab) citytable <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population") str (citytable)

widzisz, że nie masz poprawnej tabeli, ponieważ ramka danych zawiera jeden obiekt. Ponieważ nie określiłem, która tabela, ściągnęła pierwszą tabelę HTML na stronie. To nie był ten, którego chcę. Nie mam ochoty importować każdej tabeli na stronie, dopóki nie znajdę właściwej, ale na szczęście mam rozszerzenie Chrome o nazwie Table Capture, które pozwala mi wyświetlić listę tabel na stronie.

Kiedy ostatnio sprawdzałem, chciałem znaleźć tabelę 5 z ponad 300 wierszami. Jeśli to teraz nie zadziała, spróbuj zainstalować Table Capture w przeglądarce Chrome, aby sprawdzić, którą tabelę chcesz pobrać.

Spróbuję ponownie, określając tabelę 5, a następnie sprawdzając, jakie nazwy kolumn znajdują się w nowej tabeli miast. Zauważ, że w poniższym kodzie umieściłem citytable <- htmltab()polecenie w wielu wierszach. Dlatego nie przekroczył marginesów - możesz trzymać wszystko w jednym wierszu. Jeśli numer tabeli zmienił się od czasu opublikowania tego artykułu, zastąp which = 5poprawnym numerem.

Zamiast korzystać ze strony w Wikipedii, możesz zamienić adres URL Wikipedii na adres URL kopii utworzonego przeze mnie pliku. Ten plik znajduje się pod adresem //bit.ly/WikiCityList. Aby korzystać z tej wersji, typ bit.ly/WikiCityListw przeglądarce, a następnie skopiować go długi adres URL przekierowuje i wykorzystanie że zamiast Wikipedia URL w kodzie poniżej:

library (htmltab) citytable <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population", która = 5) colnames (citytable)

Skąd wiedziałem, whichże argument potrzebny mi do określenia numeru tabeli? Przeczytałem htmltabplik pomocy za pomocą polecenia ?htmltab. Obejmowało to wszystkie dostępne argumenty. Przejrzałem możliwości i „ whichwektor o długości jeden do identyfikacji tabeli w dokumencie” wyglądał dobrze.

Zwróć też uwagę, że użyłem colnames(citytable)zamiast names(citytable)zobaczyć nazwy kolumn. Albo zadziała. Podstawa R ma również  rownames()funkcję.

W każdym razie te wyniki tabeli są znacznie lepsze, chociaż po uruchomieniu widać, str(citytable)że kilka kolumn, które powinny być liczbami, pojawiło się jako ciągi znaków. Możesz to zobaczyć zarówno po chrznaku obok nazwy kolumny, jak i po cudzysłowie wokół wartości, takich jak 8,550,405.

To jedna z małych niedogodności R: R generalnie nie rozumie, że 8,550to liczba. Sam poradziłem sobie z tym problemem, pisząc własną funkcję w moim własnym pakiecie rmiscutils, aby zamienić wszystkie te „ciągi znaków”, które są tak naprawdę liczbami z przecinkami, z powrotem na liczby. Każdy może pobrać pakiet z GitHub i używać go.

Najpopularniejszym sposobem instalowania pakietów z GitHub jest użycie pakietu o nazwie devtools. devtools to niezwykle potężny pakiet przeznaczony głównie dla osób, które chcą pisać własne pakiety, i zawiera kilka sposobów instalowania pakietów z innych miejsc niż CRAN. Jednak devtools zwykle wymaga kilku dodatkowych kroków w celu zainstalowania w porównaniu z typowym pakietem i chcę pozostawić irytujące zadania administratora systemu, aż będą absolutnie konieczne.

Jednak pakiet pacman instaluje również pakiety ze źródeł innych niż CRAN, takich jak GitHub. Jeśli jeszcze tego nie zrobiłeś, zainstaluj pacman zinstall.packages("pacman").

p_install_gh("username/packagerepo")Funkcja pacmana jest instalowana z repozytorium GitHub.

p_load_gh("username/packagerepo")ładuje pakiet do pamięci, jeśli już istnieje w systemie, i najpierw instaluje, a następnie ładuje pakiet z GitHub, jeśli pakiet nie istnieje lokalnie.

Mój pakiet narzędzi rmisc można znaleźć pod adresem smach/rmiscutils. Uruchom, pacman::p_load_gh("smach/rmiscutils")aby zainstalować mój pakiet rmiscutils.

Uwaga: Alternatywny pakiet do instalowania pakietów z GitHub to piloty, które można zainstalować przez  install.packages("remotes"). Jego głównym celem jest instalowanie pakietów ze zdalnych repozytoriów, takich jak GitHub. Możesz zajrzeć do pliku pomocy z help(package="remotes").

I prawdopodobnie najbardziej zręcznym ze wszystkich jest pakiet o nazwie githubinstall. Ma na celu odgadnięcie repozytorium, w którym znajduje się pakiet. Zainstaluj go przez  install.packages("githubinstall"); wtedy możesz zainstalować mój pakiet rmiscutils za pomocą  githubinstall::gh_install_packages("rmiscutils"). Zostaniesz zapytany, czy chcesz zainstalować pakiet w smach/rmisutils(robisz).

Po zainstalowaniu mojej kolekcji funkcji możesz użyć mojej number_with_commas()funkcji, aby zmienić te ciągi znaków, które powinny być liczbami, z powrotem na liczby. Zdecydowanie sugeruję dodanie nowej kolumny do ramki danych zamiast modyfikowania istniejącej kolumny - to dobra praktyka analizy danych bez względu na platformę, z której korzystasz.

W tym przykładzie nazwę nowej kolumny PopEst2017. (Jeśli tabela została zaktualizowana od tego czasu, użyj odpowiednich nazw kolumn).

biblioteka (rmiscutils) citytable $ PopEst2017 <- number_with_commas (citytable $ `2017 oszacowanie`)

Nawiasem mówiąc, mój pakiet rmiscutils nie jest jedynym sposobem radzenia sobie z importowanymi liczbami, które mają przecinki. Po utworzeniu pakietu rmiscutils i jego number_with_commas()funkcji narodził się pakiet tidyverse readr. readr zawiera również funkcję, która ciągi znaków na liczby obrotów, parse_number().

Po zainstalowaniu readr możesz wygenerować liczby z kolumny szacunkowej 2017 za pomocą readr:

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

Jedną z zalet readr::parse_number()jest to, że możesz zdefiniować własne, locale()aby kontrolować takie rzeczy, jak kodowanie i znaki dziesiętne, które mogą być interesujące dla czytelników spoza Stanów Zjednoczonych. Uruchom ?parse_number, aby uzyskać więcej informacji.

Uwaga: Jeśli nie użyłeś uzupełniania tabulatorów dla kolumny oszacowania 2017, mógł wystąpić problem z nazwą tej kolumny, jeśli zawiera spację w czasie wykonywania tego kodu. W powyższym kodzie zauważ, że `wokół nazwy kolumny znajdują się pojedyncze cudzysłowy ( ). Dzieje się tak, ponieważ istniejąca nazwa zawierała spację, której nie powinno być w R. Ta nazwa kolumny ma inny problem: zaczyna się od liczby, również zazwyczaj R nie-nie. RStudio wie o tym i automatycznie dodaje potrzebne cudzysłowy wokół nazwy z funkcją autouzupełniania tabulatorów.

Dodatkowa wskazówka: istnieje pakiet R (oczywiście, że jest!) O nazwie dozorca, który może automatycznie naprawić kłopotliwe nazwy kolumn zaimportowane ze źródła danych, które nie jest przyjazne dla języka R. Zainstaluj go z install.packages("janitor"). Następnie możesz utworzyć nowe, czyste nazwy kolumn za pomocą clean_names()funkcji dozorcy .

Teraz utworzę całkowicie nową ramkę danych zamiast zmieniać nazwy kolumn w mojej oryginalnej ramce danych i uruchomię funkcję clean_names () woźnego na oryginalnych danych. Następnie sprawdź nazwy kolumn ramek danych za pomocą names():

citytable_cleaned <- woźny :: clean_names (citytable)

nazwy (citytable_cleaned)

Widzisz, że spacje zostały zamienione na podkreślenia, które są dozwolone w nazwach zmiennych R (podobnie jak kropki). Wszystkie nazwy kolumn, które wcześniej zaczynały się od liczby, mają teraz xna początku.

Jeśli nie chcesz tracić pamięć posiadające dwie kopie zasadniczo tych samych danych, można usunąć obiekt R z sesji roboczej z  rm()funkcji: rm(citytable).

Importuj dane z paczek

Istnieje kilka pakietów, które umożliwiają dostęp do danych bezpośrednio z R. Jednym z nich jest quantmod, który umożliwia pobieranie niektórych danych rządowych i finansowych Stanów Zjednoczonych bezpośrednio do R.

Kolejny to trafnie nazwany pakiet weatherdata w CRAN. Może pobierać dane z Weather Underground API, które zawiera informacje o wielu krajach na całym świecie. 

Pakiet rnoaa, projekt grupy rOpenSci, korzysta z kilku różnych zestawów danych amerykańskiej National Oceanic and Atmospheric Administration, w tym informacji o dziennym klimacie, boi i burzach.

Jeśli interesują Cię dane władz stanowych lub lokalnych w Stanach Zjednoczonych lub Kanadzie, możesz sprawdzić RSocrata, aby sprawdzić, czy agencja, która Cię interesuje, publikuje tam dane. Nie znalazłem jeszcze pełnej listy wszystkich dostępnych zestawów danych Socrata, ale istnieje strona wyszukiwania pod adresem //www.opendatanetwork.com. Uważaj jednak: istnieją zestawy przesłane przez społeczność wraz z oficjalnymi danymi rządowymi, więc sprawdź właściciela zestawu danych i prześlij źródło, zanim zaczniesz polegać na nim w praktyce. Wynik „Zbiór danych ODN” oznacza, że ​​jest to plik przesłany przez osobę publiczną. Oficjalne zbiory danych rządowych zwykle znajdują się pod adresami URL takimi jak //data.CityOrStateName.gov//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.”

Ramki danych są prostokątne: każdy wiersz musi mieć taką samą liczbę wpisów (chociaż niektóre mogą być puste), a każda kolumna musi mieć taką samą liczbę elementów.

Kolumny arkusza kalkulacyjnego programu Excel są zwykle określane za pomocą liter: Kolumna A, Kolumna B itd. Możesz odwołać się do kolumny ramki danych z jej nazwą, używając składni dataFrameName$columnName. Jeśli więc wpiszesz snowdata$Totali naciśniesz Enter, zobaczysz wszystkie wartości w Totalkolumnie, jak pokazano na poniższym rysunku. (Dlatego po uruchomieniu str(snowdata)polecenia przed nazwą każdej kolumny znajduje się znak dolara).

Grupa 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().

Dwa inne pakiety mogą być interesujące do przechowywania i pobierania danych. Pakiet pióro zapisuje w formacie binarnym, który można wczytać do R lub Pythona. I pakiet FST użytkownika read.fst()i write.fst()oferta szybkie zapisywanie i wczytywanie ramki danych obiektów R-plus opcja kompresji plików.