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:

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/