In this tutorial, we’ll work on reading in and describing data,
making use of some tidyverse packages and functions along
the way.
First order of business: load up the tidyverse
library(tidyverse)
Reading in Data
There are a few options for reading in data in R. Most of the time,
we’ll be working with .csv data files (i.e., rectangular spreadsheets in
a universal plain-text format).
For such files, we can use:
read.csv()
read_csv() <- this is a tidyverse
option
Let’s read in the Nettle (1999) data used in Winter Ch. 1 and 2:
nettle <- read_csv("nettle_1999_climate.csv")
Examining Data
Let’s take a look at this data. We’ll use two functions that allow us
to check out the top few rows and the bottom few rows:
head(nettle)
tail(nettle)
You can also click the little spreadsheet icon next to the
nettle object in the top-right window of RStudio.
Now we’ll practice using a few dplyr commands that help
us focus or narrow down the dataset.
filter() identifies rows that meet some kind of logical
condition. We typically use >, <, >=, <=, ==, and != (not
equal) for logical conditions.
filter(nettle, Langs > 200)
filter(nettle, Country == "Botswana")
We might also want to narrow down the number of variables to look at,
using select():
select(nettle, Country, Langs)
A Little Data Cleaning
We may want to change some variable names in this data. Let’s use the
rename() function to do that:
nettle <- rename(nettle, Languages = Langs)
And let’s get rid of a variable that we don’t need right now:
nettle <- nettle %>% select(Country, Population, Languages)
You’ll notice that I did something different here - I used what is
called the pipe operator (%>%). This has the effect of
taking the thing on the left side of the pipe and sticking it into the
first argument of the function on the right side. In this case, it meant
that I didn’t have to put nettle as the first argument in
select().
Explore the Data Visually
We’ll use ggplot() to get a sense of the data and some
relationships within it. Let’s start with a histogram:
nettle %>% ggplot(aes(x = Languages))+
geom_histogram()+
theme_bw()

This tells us very quickly that the number of languages per country
is a variable with a very positive skew.
nettle %>% ggplot(aes(x = Population)) +
geom_histogram()+
theme_bw()

Population, on the other hand, has a rather symmetrical distribution.
Most countries are around 4 (million? I’m guessing).
Let’s try a new plot to see if there’s any relation between our two
variables of interest - a scatterplot.
nettle %>% ggplot(aes(x = Population, y = Languages))+
geom_point()+
theme_bw()

This is interesting - there’s not a really clear/clean pattern,
though it does seem like there are more languages in countries with
larger populations. But the country with the most languages is pretty
average in terms of population.
#Some Descriptive Statistics
Last week we covered some basic functions for computing means, SDs,
and other statistics useful for describing data. This time, we’ll do
something a little more sophisticated using the summarize()
function.
nettle %>% summarise(pop_mean = mean(Population),
pop_sd = sd(Population),
pop_median = median(Population),
pop_min = min(Population),
pop_max = max(Population),
pop_range = pop_max - pop_min)
Neat, right? We can do the same thing for Languages - just copy and
paste the code, and then use ctrl-f to do some find-and-replace. Replace
“pop_” with “lang_” and “Population” with “Languages”.
nettle %>% summarise(langs_mean = mean(Languages),
langs_sd = sd(Languages),
langs_median = median(Languages),
langs_min = min(Languages),
langs_max = max(Languages),
langs_range = langs_max - langs_min)
More Practice: Perry & Winter’s Iconicity data
Let’s read in some other data.
iconic <- read_csv("perry_winter_2017_iconicity.csv")
mod <- read_csv("lynott_connell_2009_modality.csv")
We just read in two sets of data. Each file contains information
about words (i.e., variables related to different semantic aspects of
words), but different types of information. Eventually we can combine
the two data sets.
Next, let’s do some more plotting.
iconic %>% ggplot(aes(x = Iconicity))+
geom_histogram(fill = "peachpuff3")+
geom_vline(aes(xintercept = 0), linetype = 2)+
theme_minimal()

Alright, let’s join the two data sets. We’ll use a type of join
called left_join():
both <- left_join(iconic, mod)
We’ll also narrow down this combined dataset to just the words of
particular classes and rename a variable:
both <- filter(both, POS %in% c("Adjective", "Verb", "Noun")) %>%
rename(Modality = DominantModality)
Now for some more plotting:
both %>% ggplot(aes(x = Modality, y = Iconicity, fill = Modality))+
geom_boxplot()+
theme_minimal()

This looks neat! But we have a lot of NAs in the data - the modality
dataset contained many fewer words than the iconicity dataset. Let’s
focus on just the words that we have both iconicity and modality
information for.
both %>% filter(!is.na(Modality)) %>%
ggplot(aes(x = Modality, y = Iconicity, fill = Modality))+
geom_boxplot()+
theme_minimal()

Summarizing counts…
both %>% count(Modality)
Similarly, table() and xtabs():
table(both$Modality)
Auditory Gustatory Haptic Olfactory Visual
67 47 67 24 202
xtabs(~Modality, data = both)
Modality
Auditory Gustatory Haptic Olfactory Visual
67 47 67 24 202
What else can we do with this data?
LS0tDQp0aXRsZTogIkRlc2NyaWJpbmcgRGF0YSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkluIHRoaXMgdHV0b3JpYWwsIHdlJ2xsIHdvcmsgb24gcmVhZGluZyBpbiBhbmQgZGVzY3JpYmluZyBkYXRhLCBtYWtpbmcgdXNlIG9mIHNvbWUgYHRpZHl2ZXJzZWAgcGFja2FnZXMgYW5kIGZ1bmN0aW9ucyBhbG9uZyB0aGUgd2F5Lg0KDQpGaXJzdCBvcmRlciBvZiBidXNpbmVzczogbG9hZCB1cCB0aGUgYHRpZHl2ZXJzZWANCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KIyBSZWFkaW5nIGluIERhdGENCg0KVGhlcmUgYXJlIGEgZmV3IG9wdGlvbnMgZm9yIHJlYWRpbmcgaW4gZGF0YSBpbiBSLiBNb3N0IG9mIHRoZSB0aW1lLCB3ZSdsbCBiZSB3b3JraW5nIHdpdGggLmNzdiBkYXRhIGZpbGVzIChpLmUuLCByZWN0YW5ndWxhciBzcHJlYWRzaGVldHMgaW4gYSB1bml2ZXJzYWwgcGxhaW4tdGV4dCBmb3JtYXQpLg0KDQpGb3Igc3VjaCBmaWxlcywgd2UgY2FuIHVzZToNCg0KKiBgcmVhZC5jc3YoKWANCiogYHJlYWRfY3N2KClgIDwtIHRoaXMgaXMgYSBgdGlkeXZlcnNlYCBvcHRpb24NCg0KTGV0J3MgcmVhZCBpbiB0aGUgTmV0dGxlICgxOTk5KSBkYXRhIHVzZWQgaW4gV2ludGVyIENoLiAxIGFuZCAyOg0KDQpgYGB7cn0NCm5ldHRsZSA8LSByZWFkX2NzdigibmV0dGxlXzE5OTlfY2xpbWF0ZS5jc3YiKQ0KYGBgDQoNCiMgRXhhbWluaW5nIERhdGENCg0KTGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBkYXRhLiBXZSdsbCB1c2UgdHdvIGZ1bmN0aW9ucyB0aGF0IGFsbG93IHVzIHRvIGNoZWNrIG91dCB0aGUgdG9wIGZldyByb3dzIGFuZCB0aGUgYm90dG9tIGZldyByb3dzOg0KDQpgYGB7cn0NCmhlYWQobmV0dGxlKQ0KYGBgDQoNCmBgYHtyfQ0KdGFpbChuZXR0bGUpDQpgYGANCg0KWW91IGNhbiBhbHNvIGNsaWNrIHRoZSBsaXR0bGUgc3ByZWFkc2hlZXQgaWNvbiBuZXh0IHRvIHRoZSBgbmV0dGxlYCBvYmplY3QgaW4gdGhlIHRvcC1yaWdodCB3aW5kb3cgb2YgUlN0dWRpby4NCg0KTm93IHdlJ2xsIHByYWN0aWNlIHVzaW5nIGEgZmV3IGBkcGx5cmAgY29tbWFuZHMgdGhhdCBoZWxwIHVzIGZvY3VzIG9yIG5hcnJvdyBkb3duIHRoZSBkYXRhc2V0Lg0KDQpgZmlsdGVyKClgIGlkZW50aWZpZXMgcm93cyB0aGF0IG1lZXQgc29tZSBraW5kIG9mIGxvZ2ljYWwgY29uZGl0aW9uLiBXZSB0eXBpY2FsbHkgdXNlID4sIDwsID49LCA8PSwgPT0sIGFuZCAhPSAobm90IGVxdWFsKSBmb3IgbG9naWNhbCBjb25kaXRpb25zLiANCg0KYGBge3J9DQpmaWx0ZXIobmV0dGxlLCBMYW5ncyA+IDIwMCkNCmBgYA0KDQpgYGB7cn0NCmZpbHRlcihuZXR0bGUsIENvdW50cnkgPT0gIkJvdHN3YW5hIikNCmBgYA0KDQpXZSBtaWdodCBhbHNvIHdhbnQgdG8gbmFycm93IGRvd24gdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgdG8gbG9vayBhdCwgdXNpbmcgYHNlbGVjdCgpYDoNCg0KYGBge3J9DQpzZWxlY3QobmV0dGxlLCBDb3VudHJ5LCBMYW5ncykNCmBgYA0KDQojIEEgTGl0dGxlIERhdGEgQ2xlYW5pbmcNCg0KV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHNvbWUgdmFyaWFibGUgbmFtZXMgaW4gdGhpcyBkYXRhLiBMZXQncyB1c2UgdGhlIGByZW5hbWUoKWAgZnVuY3Rpb24gdG8gZG8gdGhhdDoNCg0KYGBge3J9DQpuZXR0bGUgPC0gcmVuYW1lKG5ldHRsZSwgTGFuZ3VhZ2VzID0gTGFuZ3MpDQpgYGANCg0KQW5kIGxldCdzIGdldCByaWQgb2YgYSB2YXJpYWJsZSB0aGF0IHdlIGRvbid0IG5lZWQgcmlnaHQgbm93Og0KDQpgYGB7cn0NCm5ldHRsZSA8LSBuZXR0bGUgJT4lIHNlbGVjdChDb3VudHJ5LCBQb3B1bGF0aW9uLCBMYW5ndWFnZXMpDQpgYGANCg0KWW91J2xsIG5vdGljZSB0aGF0IEkgZGlkIHNvbWV0aGluZyBkaWZmZXJlbnQgaGVyZSAtIEkgdXNlZCB3aGF0IGlzIGNhbGxlZCB0aGUgcGlwZSBvcGVyYXRvciAoYCU+JWApLiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHRha2luZyB0aGUgdGhpbmcgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgcGlwZSBhbmQgc3RpY2tpbmcgaXQgaW50byB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGZ1bmN0aW9uIG9uIHRoZSByaWdodCBzaWRlLiBJbiB0aGlzIGNhc2UsIGl0IG1lYW50IHRoYXQgSSBkaWRuJ3QgaGF2ZSB0byBwdXQgYG5ldHRsZWAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGluIGBzZWxlY3QoKWAuDQoNCiMgRXhwbG9yZSB0aGUgRGF0YSBWaXN1YWxseQ0KDQpXZSdsbCB1c2UgYGdncGxvdCgpYCB0byBnZXQgYSBzZW5zZSBvZiB0aGUgZGF0YSBhbmQgc29tZSByZWxhdGlvbnNoaXBzIHdpdGhpbiBpdC4gTGV0J3Mgc3RhcnQgd2l0aCBhIGhpc3RvZ3JhbToNCg0KYGBge3J9DQpuZXR0bGUgJT4lIGdncGxvdChhZXMoeCA9IExhbmd1YWdlcykpKw0KICBnZW9tX2hpc3RvZ3JhbSgpKw0KICB0aGVtZV9idygpDQpgYGANCg0KVGhpcyB0ZWxscyB1cyB2ZXJ5IHF1aWNrbHkgdGhhdCB0aGUgbnVtYmVyIG9mIGxhbmd1YWdlcyBwZXIgY291bnRyeSBpcyBhIHZhcmlhYmxlIHdpdGggYSB2ZXJ5IHBvc2l0aXZlIHNrZXcuDQoNCmBgYHtyfQ0KbmV0dGxlICU+JSBnZ3Bsb3QoYWVzKHggPSBQb3B1bGF0aW9uKSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgpKw0KICB0aGVtZV9idygpDQpgYGANCg0KUG9wdWxhdGlvbiwgb24gdGhlIG90aGVyIGhhbmQsIGhhcyBhIHJhdGhlciBzeW1tZXRyaWNhbCBkaXN0cmlidXRpb24uIE1vc3QgY291bnRyaWVzIGFyZSBhcm91bmQgNCAobWlsbGlvbj8gSSdtIGd1ZXNzaW5nKS4NCg0KTGV0J3MgdHJ5IGEgbmV3IHBsb3QgdG8gc2VlIGlmIHRoZXJlJ3MgYW55IHJlbGF0aW9uIGJldHdlZW4gb3VyIHR3byB2YXJpYWJsZXMgb2YgaW50ZXJlc3QgLSBhIHNjYXR0ZXJwbG90Lg0KDQpgYGB7cn0NCm5ldHRsZSAlPiUgZ2dwbG90KGFlcyh4ID0gUG9wdWxhdGlvbiwgeSA9IExhbmd1YWdlcykpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lX2J3KCkNCmBgYA0KDQpUaGlzIGlzIGludGVyZXN0aW5nIC0gdGhlcmUncyBub3QgYSByZWFsbHkgY2xlYXIvY2xlYW4gcGF0dGVybiwgdGhvdWdoIGl0IGRvZXMgc2VlbSBsaWtlIHRoZXJlIGFyZSBtb3JlIGxhbmd1YWdlcyBpbiBjb3VudHJpZXMgd2l0aCBsYXJnZXIgcG9wdWxhdGlvbnMuIEJ1dCB0aGUgY291bnRyeSB3aXRoIHRoZSBtb3N0IGxhbmd1YWdlcyBpcyBwcmV0dHkgYXZlcmFnZSBpbiB0ZXJtcyBvZiBwb3B1bGF0aW9uLg0KDQojU29tZSBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQoNCkxhc3Qgd2VlayB3ZSBjb3ZlcmVkIHNvbWUgYmFzaWMgZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgbWVhbnMsIFNEcywgYW5kIG90aGVyIHN0YXRpc3RpY3MgdXNlZnVsIGZvciBkZXNjcmliaW5nIGRhdGEuIFRoaXMgdGltZSwgd2UnbGwgZG8gc29tZXRoaW5nIGEgbGl0dGxlIG1vcmUgc29waGlzdGljYXRlZCB1c2luZyB0aGUgYHN1bW1hcml6ZSgpYCBmdW5jdGlvbi4NCg0KYGBge3J9DQpuZXR0bGUgJT4lIHN1bW1hcmlzZShwb3BfbWVhbiA9IG1lYW4oUG9wdWxhdGlvbiksDQogICAgICAgICAgICAgICAgICAgICBwb3Bfc2QgPSBzZChQb3B1bGF0aW9uKSwNCiAgICAgICAgICAgICAgICAgICAgIHBvcF9tZWRpYW4gPSBtZWRpYW4oUG9wdWxhdGlvbiksDQogICAgICAgICAgICAgICAgICAgICBwb3BfbWluID0gbWluKFBvcHVsYXRpb24pLA0KICAgICAgICAgICAgICAgICAgICAgcG9wX21heCA9IG1heChQb3B1bGF0aW9uKSwNCiAgICAgICAgICAgICAgICAgICAgIHBvcF9yYW5nZSA9IHBvcF9tYXggLSBwb3BfbWluKQ0KYGBgDQoNCk5lYXQsIHJpZ2h0PyBXZSBjYW4gZG8gdGhlIHNhbWUgdGhpbmcgZm9yIExhbmd1YWdlcyAtIGp1c3QgY29weSBhbmQgcGFzdGUgdGhlIGNvZGUsIGFuZCB0aGVuIHVzZSBjdHJsLWYgdG8gZG8gc29tZSBmaW5kLWFuZC1yZXBsYWNlLiBSZXBsYWNlICJwb3BfIiB3aXRoICJsYW5nXyIgYW5kICJQb3B1bGF0aW9uIiB3aXRoICJMYW5ndWFnZXMiLg0KDQpgYGB7cn0NCm5ldHRsZSAlPiUgc3VtbWFyaXNlKGxhbmdzX21lYW4gPSBtZWFuKExhbmd1YWdlcyksDQogICAgICAgICAgICAgICAgICAgICBsYW5nc19zZCA9IHNkKExhbmd1YWdlcyksDQogICAgICAgICAgICAgICAgICAgICBsYW5nc19tZWRpYW4gPSBtZWRpYW4oTGFuZ3VhZ2VzKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhbmdzX21pbiA9IG1pbihMYW5ndWFnZXMpLA0KICAgICAgICAgICAgICAgICAgICAgbGFuZ3NfbWF4ID0gbWF4KExhbmd1YWdlcyksDQogICAgICAgICAgICAgICAgICAgICBsYW5nc19yYW5nZSA9IGxhbmdzX21heCAtIGxhbmdzX21pbikNCmBgYA0KDQojIE1vcmUgUHJhY3RpY2U6IFBlcnJ5ICYgV2ludGVyJ3MgSWNvbmljaXR5IGRhdGENCg0KTGV0J3MgcmVhZCBpbiBzb21lIG90aGVyIGRhdGEuDQoNCmBgYHtyfQ0KaWNvbmljIDwtIHJlYWRfY3N2KCJwZXJyeV93aW50ZXJfMjAxN19pY29uaWNpdHkuY3N2IikNCm1vZCA8LSByZWFkX2NzdigibHlub3R0X2Nvbm5lbGxfMjAwOV9tb2RhbGl0eS5jc3YiKQ0KYGBgDQoNCldlIGp1c3QgcmVhZCBpbiB0d28gc2V0cyBvZiBkYXRhLiBFYWNoIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd29yZHMgKGkuZS4sIHZhcmlhYmxlcyByZWxhdGVkIHRvIGRpZmZlcmVudCBzZW1hbnRpYyBhc3BlY3RzIG9mIHdvcmRzKSwgYnV0IGRpZmZlcmVudCB0eXBlcyBvZiBpbmZvcm1hdGlvbi4gRXZlbnR1YWxseSB3ZSBjYW4gY29tYmluZSB0aGUgdHdvIGRhdGEgc2V0cy4NCg0KTmV4dCwgbGV0J3MgZG8gc29tZSBtb3JlIHBsb3R0aW5nLg0KDQpgYGB7cn0NCmljb25pYyAlPiUgZ2dwbG90KGFlcyh4ID0gSWNvbmljaXR5KSkrDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAicGVhY2hwdWZmMyIpKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gMCksIGxpbmV0eXBlID0gMikrDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkFscmlnaHQsIGxldCdzIGpvaW4gdGhlIHR3byBkYXRhIHNldHMuIFdlJ2xsIHVzZSBhIHR5cGUgb2Ygam9pbiBjYWxsZWQgYGxlZnRfam9pbigpYDoNCg0KYGBge3J9DQpib3RoIDwtIGxlZnRfam9pbihpY29uaWMsIG1vZCkNCmBgYA0KDQpXZSdsbCBhbHNvIG5hcnJvdyBkb3duIHRoaXMgY29tYmluZWQgZGF0YXNldCB0byBqdXN0IHRoZSB3b3JkcyBvZiBwYXJ0aWN1bGFyIGNsYXNzZXMgYW5kIHJlbmFtZSBhIHZhcmlhYmxlOg0KDQpgYGB7cn0NCmJvdGggPC0gZmlsdGVyKGJvdGgsIFBPUyAlaW4lIGMoIkFkamVjdGl2ZSIsICJWZXJiIiwgIk5vdW4iKSkgJT4lDQogIHJlbmFtZShNb2RhbGl0eSA9IERvbWluYW50TW9kYWxpdHkpDQpgYGANCg0KTm93IGZvciBzb21lIG1vcmUgcGxvdHRpbmc6DQoNCmBgYHtyfQ0KYm90aCAlPiUgZ2dwbG90KGFlcyh4ID0gTW9kYWxpdHksIHkgPSBJY29uaWNpdHksIGZpbGwgPSBNb2RhbGl0eSkpKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KVGhpcyBsb29rcyBuZWF0ISBCdXQgd2UgaGF2ZSBhIGxvdCBvZiBOQXMgaW4gdGhlIGRhdGEgLSB0aGUgbW9kYWxpdHkgZGF0YXNldCBjb250YWluZWQgbWFueSBmZXdlciB3b3JkcyB0aGFuIHRoZSBpY29uaWNpdHkgZGF0YXNldC4gTGV0J3MgZm9jdXMgb24ganVzdCB0aGUgd29yZHMgdGhhdCB3ZSBoYXZlIGJvdGggaWNvbmljaXR5IGFuZCBtb2RhbGl0eSBpbmZvcm1hdGlvbiBmb3IuDQoNCmBgYHtyfQ0KYm90aCAlPiUgZmlsdGVyKCFpcy5uYShNb2RhbGl0eSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBNb2RhbGl0eSwgeSA9IEljb25pY2l0eSwgZmlsbCA9IE1vZGFsaXR5KSkrDQogIGdlb21fYm94cGxvdCgpKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KU3VtbWFyaXppbmcgY291bnRzLi4uDQoNCmBgYHtyfQ0KYm90aCAlPiUgY291bnQoTW9kYWxpdHkpDQpgYGANCg0KU2ltaWxhcmx5LCBgdGFibGUoKWAgYW5kIGB4dGFicygpYDoNCg0KYGBge3J9DQp0YWJsZShib3RoJE1vZGFsaXR5KQ0KDQp4dGFicyh+TW9kYWxpdHksIGRhdGEgPSBib3RoKQ0KYGBgDQoNCldoYXQgZWxzZSBjYW4gd2UgZG8gd2l0aCB0aGlzIGRhdGE/