R Tutorial: So importieren Sie Daten in R.

Holen Sie sich das komplette Buch
Praktisches R für Massenkommunikation und Journalismus UVP 59,95 USD Siehe es

Dieser Artikel wurde mit Genehmigung des Herausgebers aus „Praktisches R für Massenkommunikation und Journalismus“ extrahiert. © 2019 Taylor & Francis Group, LLC.

Bevor Sie Daten analysieren und visualisieren können, müssen Sie diese Daten in R übertragen. Es gibt verschiedene Möglichkeiten, dies zu tun, je nachdem, wie Ihre Daten formatiert sind und wo sie sich befinden.

Normalerweise hängt die Funktion, mit der Sie Daten importieren, vom Dateiformat der Daten ab. In Base R können Sie beispielsweise eine CSV-Datei mit importieren read.csv(). Hadley Wickham hat ein Paket namens readxl erstellt, das erwartungsgemäß über eine Funktion zum Einlesen von Excel-Dateien verfügt. Es gibt ein weiteres Paket, Google Sheets, mit dem Sie Daten aus Google-Tabellen abrufen können.

Aber wenn Sie sich nicht an all das erinnern wollen, gibt es Rio.

Die Magie von Rio

„Das Ziel von rio ist es, die Datendatei-E / A [Import / Ausgabe] in R so einfach wie möglich zu gestalten, indem drei einfache Funktionen im Schweizer Taschenmesser-Stil implementiert werden“, so die GitHub-Seite des Projekts. Diese Funktionen sind import(), export()und convert().

Das Rio-Paket hat also nur eine Funktion zum Einlesen vieler verschiedener Dateitypen : import(). Wenn Sie import("myfile.csv"), wissen Sie , eine Funktion zum Lesen einer CSV-Datei zu verwenden. import("myspreadsheet.xlsx")funktioniert genauso. Tatsächlich verarbeitet Rio mehr als zwei Dutzend Formate, einschließlich durch Tabulatoren getrennter Daten (mit der Erweiterung .tsv), JSON-, Stata- und Formatdaten mit fester Breite (.fwf).

Für dieses Tutorial benötigte Pakete

  • Rio
  • htmltab
  • readxl
  • googlesheets
  • Pacman
  • Hausmeister
  • rmiscutils (pm GitHub) oder readr
  • tibble

Sobald Sie Ihre Daten analysiert haben und die Ergebnisse als CSV, Excel-Tabelle oder andere Formate speichern möchten, export()kann die Funktion von rio dies verarbeiten.

Wenn Sie das Rio-Paket noch nicht auf Ihrem System haben, installieren Sie es jetzt mit install.packages("rio").

Ich habe einige Beispieldaten mit Schneefalldaten für den Winter in Boston erstellt. Sie können zu //bit.ly/BostonSnowfallCSV gehen und mit der rechten Maustaste klicken, um die Datei als BostonWinterSnowfalls.csv in Ihrem aktuellen R-Projekt-Arbeitsverzeichnis zu speichern. Einer der Punkte beim Erstellen von Skripten besteht jedoch darin, manuelle Arbeit - mühsam oder auf andere Weise - durch eine Automatisierung zu ersetzen, die leicht zu reproduzieren ist. Anstatt zum Herunterladen zu klicken, können Sie die download.fileFunktion von R mit der folgenden Syntax verwenden download.file("url", "destinationFileName.csv"):

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

Dies setzt voraus, dass Ihr System von dieser Bit.ly-URL-Verknüpfung umleitet und die echte Datei-URL //raw.githubusercontent.com/smach/NICAR15data/master/BostonWinterSnowfalls.csv erfolgreich findet. Ich hatte gelegentlich Probleme beim Zugriff auf Webinhalte auf alten Windows-PCs. Wenn Sie eine davon haben und dieser Bit.ly-Link nicht funktioniert, können Sie die tatsächliche URL gegen den Bit.ly-Link austauschen. Eine andere Möglichkeit besteht darin, Ihren Windows-PC nach Möglichkeit auf Windows 10 zu aktualisieren, um festzustellen, ob dies der Fall ist.

Wenn Sie möchten, dass Rio Daten einfach direkt von einer URL importieren kann, ist dies tatsächlich möglich, und ich werde im nächsten Abschnitt darauf zurückkommen. In diesem Abschnitt geht es darum, das Arbeiten mit einer lokalen Datei zu üben.

Sobald Sie die Testdatei auf Ihrem lokalen System haben, können Sie diese Daten mit dem folgenden Code in ein R-Objekt namens snowdata laden:

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

Beachten Sie, dass Rio Sie möglicherweise auffordert, die Datei im Binärformat erneut herunterzuladen. In diesem Fall müssen Sie sie ausführen

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

Stellen Sie sicher, dass Sie die Optionen zum Ausfüllen der Registerkarten von RStudio verwenden. Wenn Sie tippen rio::und warten, erhalten Sie eine Liste aller verfügbaren Funktionen. Geben Sie ein snowund warten Sie. Als Option sollte der vollständige Name Ihres Objekts angezeigt werden. Verwenden Sie die Aufwärts- und Abwärtspfeiltasten, um zwischen Vorschlägen für die automatische Vervollständigung zu wechseln. Sobald die gewünschte Option markiert ist, drücken Sie die Tabulatortaste (oder die Eingabetaste), um den vollständigen Objekt- oder Funktionsnamen zu Ihrem Skript hinzuzufügen.

Das Objekt snowdatasollte auf der Registerkarte "Umgebung" im oberen rechten Bereich von RStudio angezeigt werden. (Wenn in diesem oberen rechten Bereich Ihr Befehlsverlauf anstelle Ihrer Umgebung angezeigt wird, wählen Sie die Registerkarte Umgebung.)

Taylor & Francis Group

snowdatasollte zeigen, dass es 76 "obs." - Beobachtungen oder Zeilen - und zwei Variablen oder Spalten hat. Wenn Sie auf den Pfeil links neben klicken snowdata, um die Liste zu erweitern, werden die beiden Spaltennamen und der Datentyp jeder Spalte angezeigt. Das Winterist Zeichenfolgen und die TotalSpalte ist numerisch. Sie sollten auch in der Lage sein, die ersten Werte jeder Spalte im Bereich "Umgebung" anzuzeigen.

Taylor & Francis Group

Klicken Sie auf der snowdataRegisterkarte Umgebung auf das Wort selbst, um eine tabellenähnlichere Ansicht Ihrer Daten zu erhalten. Sie können dieselbe Ansicht über die R-Konsole mit dem Befehl View(snowdata)abrufen (dies muss ein großes V in der Ansicht viewsein - funktioniert nicht). Hinweis: snowdatasteht nicht in Anführungszeichen, da Sie sich auf den Namen eines R-Objekts in Ihrer Umgebung beziehen . Im vorherigen rio::importBefehl BostonWinterSnowfalls.csv steht in Anführungszeichen, da dies kein R-Objekt ist. Es ist ein Zeichenkettenname einer Datei außerhalb von R.

Taylor & Francis Group

Diese Ansicht weist einige Verhaltensweisen auf, die einer Tabellenkalkulation ähneln. Klicken Sie auf eine Spaltenüberschrift, um sie in aufsteigender Reihenfolge nach den Werten dieser Spalte zu sortieren. Klicken Sie ein zweites Mal auf dieselbe Spaltenüberschrift, um sie in absteigender Reihenfolge zu sortieren. Es gibt ein Suchfeld, um Zeilen zu finden, die bestimmten Zeichen entsprechen.

Wenn Sie auf das Filtersymbol klicken, erhalten Sie für jede Spalte einen Filter. Die WinterZeichenspalte funktioniert wie erwartet und filtert nach Zeilen, die die eingegebenen Zeichen enthalten. Wenn Sie jedoch in den TotalFilter der numerischen Spalte klicken, wird in älteren Versionen von RStudio ein Schieberegler angezeigt, während in neueren Versionen ein Histogramm und ein Filterfeld angezeigt werden .

Importieren Sie eine Datei aus dem Web

Wenn Sie eine Datei aus dem Internet herunterladen und importieren möchten, können Sie dies tun, wenn sie öffentlich verfügbar ist und in einem Format wie Excel oder CSV vorliegt. Versuchen

Schneedaten <- rio :: import ("// bit.ly/BostonSnowfallCSV", Format)

Viele Systeme können der Umleitungs-URL zur Datei folgen, selbst nachdem Sie zuerst eine Fehlermeldung erhalten haben, sofern Sie das Format angeben, "csv"da der Dateiname hier nicht enthalten ist .csv. Wenn Ihre nicht funktioniert, verwenden Sie stattdessen die URL //raw.githubusercontent.com/smach/R4JournalismBook/master/data/BostonSnowfall.csv.

rio kann auch gut formatierte HTML-Tabellen von Webseiten importieren, die Tabellen müssen jedoch äußerst gut formatiert sein. Angenommen, Sie möchten die Tabelle herunterladen, in der die Schweregrade des Nationalen Wetterdienstes für Schneestürme beschrieben sind. Die Seite des Nationalen Schneefallindex der Nationalen Zentren für Umweltinformationen enthält nur eine Tabelle, die sehr gut ausgearbeitet ist. Code wie dieser sollte also funktionieren:

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

Beachten Sie erneut, dass Sie in diesem Fall das Format angeben müssen format="html". weil die URL selbst keinen Hinweis darauf gibt, um welche Art von Datei es sich handelt. Wenn die URL einen Dateinamen mit einer .htmlErweiterung enthalten würde, würde Rio dies wissen.

Im wirklichen Leben erscheinen Webdaten jedoch selten in einer so ordentlichen, isolierten Form. Eine gute Option für Fälle, die nicht ganz so gut verarbeitet sind, ist häufig das Paket htmltab. Installieren Sie es mit install.packages("htmltab"). Die Funktion des Pakets zum Lesen einer HTML-Tabelle wird auch als htmltab bezeichnet. Aber wenn Sie dies ausführen:

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

Sie sehen, dass Sie nicht die richtige Tabelle haben, weil der Datenrahmen ein Objekt enthält. Da ich nicht angegeben habe, welche Tabelle verwendet wird, wurde die erste HTML-Tabelle auf der Seite abgerufen. Das war nicht der, den ich will. Ich möchte nicht jede Tabelle auf der Seite importieren, bis ich die richtige gefunden habe, aber zum Glück habe ich eine Chrome-Erweiterung namens Table Capture, mit der ich eine Liste der Tabellen auf einer Seite anzeigen kann.

Als ich das letzte Mal nachgesehen habe, war Tabelle 5 mit mehr als 300 Zeilen die, die ich wollte. Wenn dies für Sie jetzt nicht funktioniert, installieren Sie Table Capture in einem Chrome-Browser, um zu überprüfen, welche Tabelle Sie herunterladen möchten.

Ich werde es erneut versuchen, Tabelle 5 angeben und dann sehen, welche Spaltennamen in der neuen Stadttabelle enthalten sind. Beachten Sie, dass ich im folgenden Code den citytable <- htmltab()Befehl in mehrere Zeilen setze . Das ist so, dass es nicht über die Ränder lief - Sie können alles in einer einzigen Zeile halten. Wenn sich die Tabellennummer geändert hat, seit dieser Artikel veröffentlicht wurde, ersetzen Sie sie which = 5durch die richtige Nummer.

Anstatt die Seite bei Wikipedia zu verwenden, können Sie die Wikipedia-URL durch die URL einer Kopie der von mir erstellten Datei ersetzen. Diese Datei befindet sich unter //bit.ly/WikiCityList. Um diese Version zu verwenden, geben Sie sie bit.ly/WikiCityListin einen Browser ein, kopieren Sie die lange URL, zu der sie umgeleitet wird, und verwenden Sie diese anstelle der Wikipedia-URL im folgenden Code:

Bibliothek (htmltab) citytable <- htmltab ("// en.wikipedia.org/wiki/List_of_United_States_cities_by_population", die = 5) colnames (citytable)

Woher wusste ich, welches whichArgument ich brauchte, um die Tabellennummer anzugeben? Ich habe die htmltabHilfedatei mit dem Befehl gelesen ?htmltab. Das beinhaltete alle verfügbaren Argumente. Ich habe die Möglichkeiten gescannt und „ whichein Vektor der Länge eins zur Identifizierung der Tabelle im Dokument“ sah richtig aus.

Beachten Sie auch, dass ich colnames(citytable)anstelle names(citytable)der Spaltennamen verwendet habe. Beides wird funktionieren. Basis R hat auch die  rownames()Funktion.

Wie auch immer, diese Tabellenergebnisse sind viel besser, obwohl Sie anhand der Ausführung sehen können, str(citytable)dass einige Spalten, bei denen es sich um Zahlen handeln sollte, als Zeichenfolgen eingegeben wurden. Sie können dies sowohl chram Spaltennamen als auch an Anführungszeichen um Werte wie sehen 8,550,405.

Dies ist einer der kleinen Ärger von R: R versteht im Allgemeinen nicht, dass dies 8,550eine Zahl ist. Ich habe mich selbst mit diesem Problem befasst, indem ich meine eigene Funktion in mein eigenes rmiscutils-Paket geschrieben habe, um all die „Zeichenketten“, die wirklich Zahlen mit Kommas sind, wieder in Zahlen umzuwandeln. Jeder kann das Paket von GitHub herunterladen und verwenden.

Die beliebteste Methode zum Installieren von Paketen von GitHub ist die Verwendung eines Pakets namens devtools. devtools ist ein äußerst leistungsfähiges Paket, das hauptsächlich für Benutzer entwickelt wurde, die ihre eigenen Pakete schreiben möchten. Es enthält einige Möglichkeiten, Pakete von anderen Orten als CRAN zu installieren. Die Installation von devtools erfordert jedoch im Vergleich zu einem typischen Paket normalerweise einige zusätzliche Schritte, und ich möchte lästige Systemadministratoraufgaben so lange belassen, bis sie unbedingt erforderlich sind.

Das pacman-Paket installiert jedoch auch Pakete aus Nicht-CRAN-Quellen wie GitHub. Wenn Sie es noch nicht getan haben, installieren Sie pacman mitinstall.packages("pacman").

Die p_install_gh("username/packagerepo")Funktion von pacman wird von einem GitHub-Repo installiert.

p_load_gh("username/packagerepo")Lädt ein Paket in den Speicher, wenn es bereits auf Ihrem System vorhanden ist, und es wird zuerst installiert und dann ein Paket von GitHub geladen, wenn das Paket lokal nicht vorhanden ist.

Mein rmisc-Dienstprogrammpaket finden Sie unter smach/rmiscutils. Führen Sie aus pacman::p_load_gh("smach/rmiscutils"), um mein rmiscutils-Paket zu installieren.

Hinweis: Ein alternatives Paket zum Installieren von Paketen von GitHub heißt Fernbedienungen, über die Sie installieren können  install.packages("remotes"). Der Hauptzweck besteht darin, Pakete aus Remote-Repositorys wie GitHub zu installieren. Sie können die Hilfedatei mit ansehen help(package="remotes").

Und vielleicht das schickste von allen ist ein Paket namens githubinstall. Ziel ist es, das Repo zu erraten, in dem sich ein Paket befindet. Installieren Sie es über  install.packages("githubinstall"); dann kannst du mein rmiscutils paket mit installieren  githubinstall::gh_install_packages("rmiscutils"). Sie werden gefragt, ob Sie das Paket unter installieren möchten smach/rmisutils(Sie tun dies).

Nachdem Sie meine Funktionssammlung installiert haben, können Sie mit meiner number_with_commas()Funktion die Zeichenfolgen, die Zahlen sein sollen, wieder in Zahlen umwandeln. Ich empfehle dringend, dem Datenrahmen eine neue Spalte hinzuzufügen, anstatt eine vorhandene Spalte zu ändern. Dies ist eine gute Methode zur Datenanalyse, unabhängig davon, welche Plattform Sie verwenden.

In diesem Beispiel rufe ich die neue Spalte auf PopEst2017. (Wenn die Tabelle seitdem aktualisiert wurde, verwenden Sie die entsprechenden Spaltennamen.)

Bibliothek (rmiscutils) citytable $ PopEst2017 <- number_with_commas (citytable $ `2017 Schätzung`)

Mein rmiscutils-Paket ist übrigens nicht die einzige Möglichkeit, mit importierten Zahlen mit Kommas umzugehen. Nachdem ich mein rmiscutils-Paket und seine number_with_commas()Funktion erstellt hatte, wurde das tidyverse readr-Paket geboren. readr enthält auch eine Funktion, die Zeichenketten in Zahlen umwandelt parse_number().

Nach der Installation von readr können Sie mit readr Zahlen aus der Schätzspalte 2017 generieren:

citytable $ PopEst2017 <- readr :: parse_number (citytable $ `2017 Schätzung`)

Ein Vorteil von readr::parse_number()ist, dass Sie Ihre eigenen definieren können locale(), um Dinge wie Codierung und Dezimalstellen zu steuern, die für Leser außerhalb der USA von Interesse sein können. Führen Sie ?parse_number aus, um weitere Informationen zu erhalten.

Hinweis: Wenn Sie die Tab-Vervollständigung für die 2017-Schätzungsspalte nicht verwendet haben, ist möglicherweise ein Problem mit diesem Spaltennamen aufgetreten, wenn zum Zeitpunkt der Ausführung dieses Codes ein Leerzeichen darin enthalten ist. Beachten Sie in meinem obigen Code, dass `der Spaltenname in einfachen Anführungszeichen ( ) steht. Das liegt daran, dass der vorhandene Name ein Leerzeichen enthält, das Sie in R nicht haben sollten. Dieser Spaltenname hat ein weiteres Problem: Er beginnt mit einer Zahl, im Allgemeinen auch mit einem R-Nein-Nein. RStudio weiß dies und fügt automatisch die erforderlichen Anführungszeichen um den Namen hinzu, wobei die Registerkarte automatisch vervollständigt wird.

Bonus-Tipp: Es gibt ein R-Paket (natürlich!) Namens Hausmeister, das problematische Spaltennamen, die aus einer nicht R-freundlichen Datenquelle importiert wurden, automatisch beheben kann. Installieren Sie es mit install.packages("janitor"). Anschließend können Sie mit der Hausmeisterfunktion neue saubere Spaltennamen erstellen clean_names().

Jetzt erstelle ich einen völlig neuen Datenrahmen, anstatt die Spaltennamen in meinem ursprünglichen Datenrahmen zu ändern, und führe die clean_names () von janitor für die ursprünglichen Daten aus. Überprüfen Sie dann die Spaltennamen der Datenrahmen mit names():

citytable_cleaned <- janitor :: clean_names (citytable)

Namen (citytable_cleaned)

Sie sehen, dass die Leerzeichen in Unterstriche geändert wurden, die in R-Variablennamen zulässig sind (ebenso wie Punkte). Und alle Spaltennamen, die früher mit einer Zahl begonnen haben, haben jetzt eine xam Anfang.

Wenn Sie keinen Speicher verschwenden möchten, indem Sie zwei Kopien im Wesentlichen derselben Daten haben, können Sie ein R-Objekt mit der rm()Funktion: aus Ihrer Arbeitssitzung entfernen  rm(citytable).

Daten aus Paketen importieren

Es gibt mehrere Pakete, mit denen Sie direkt von R auf Daten zugreifen können. Eines ist quantmod, mit dem Sie einige US-Regierungs- und Finanzdaten direkt in R abrufen können.

Ein weiteres ist das treffend benannte Wetterdatenpaket auf CRAN. Es kann Daten aus der Weather Underground API abrufen, die Informationen für viele Länder auf der ganzen Welt enthält. 

Das rnoaa-Paket, ein Projekt der rOpenSci-Gruppe, greift auf verschiedene Datensätze der US-amerikanischen National Oceanic and Atmospheric Administration zurück, einschließlich täglicher Informationen zu Klima, Boje und Sturm.

If you are interested in state or local government data in the US or Canada, you may want to check out RSocrata to see if an agency you’re interested in posts data there. I’ve yet to find a complete list of all available Socrata data sets, but there’s a search page at //www.opendatanetwork.com. Be careful, though: There are community-uploaded sets along with official government data, so check a data set’s owner and upload source before relying on it for more than R practice. “ODN Dataset” in a result means it’s a file uploaded by someone in the general public. Official government data sets tend to live at URLs like //data.CityOrStateName.gov and //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.”

Datenrahmen sind rechteckig: Jede Zeile muss die gleiche Anzahl von Einträgen haben (obwohl einige leer sein können), und jede Spalte muss die gleiche Anzahl von Elementen haben.

Excel-Tabellenkalkulationsspalten werden normalerweise mit Buchstaben bezeichnet: Spalte A, Spalte B usw. Mithilfe der Syntax können Sie auf eine Datenrahmenspalte mit ihrem Namen verweisen dataFrameName$columnName. Wenn Sie also die snowdata$TotalEingabetaste eingeben und drücken, werden alle Werte in der TotalSpalte angezeigt ( siehe Abbildung unten). (Deshalb steht beim Ausführen des str(snowdata)Befehls vor dem Namen jeder Spalte ein Dollarzeichen.)

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

Zwei weitere Pakete könnten für das Speichern und Abrufen von Daten von Interesse sein. Das Federpaket wird in einem Binärformat gespeichert, das entweder in R oder Python eingelesen werden kann. Und das fst Pakets read.fst()und write.fst()bieten schnelle Speichern und Laden von R - Datenrahmen - Objekte-plus die Möglichkeit , Datei - Komprimierung.