This example will demonstrate the main functions of the package dplyr. We will be using (publically available) data of the participants of the Great British Bake Off 2018.

First we need to load dplyr into R

library(dplyr)

1. Create your own dataset from scratch

Here we are creating free variables (vectors in R)

names <- c("Antony", "Briony", "Dan","Imelda", "Jon", "Karen","Kim-Joy","Luke","Manon", "Rahul", "Ruby" ,"Terry")

sex <- c("male", "female","male", "female", "male", "female", "female","male", "female", "male", "female", "male")

hometown <- c("London", "Bristol", "London", "County Tyrone", "Newport","Wakefield", "Leeds", "Sheffield", "London", "Rotherham","London", "West Midlands")

occupation <- c("Banker", "Full-time parent", "Full-time parent", "Countryside recreation officer", "Blood courier", "In-store sampling assistant", "Mental health specialist","Civil servant/house and techno DJ", "Software project manager", "Research scientist", "Project manager", "Retired air steward")

age <- c(30, 33, 36, 33, 47, 60, 27, 30, 26, 30, 30, 56)


And now we’ll create two dataframes using the above variables

gbbo1<-data.frame(names, age, sex, occupation)
gbbo2<-data.frame(names, hometown)

2. Frequently used “dplyr” functions

These functions are some of the most frequently used, but obviously not the only ones. “dplyr” is part of the “tidyverse”, which is huge collection of packages. “dplyr” is used for data manipulation, which can be a whole course in its own right. If you’re interested in this topic and want to learn more, you can have a look at these slides and the accompanying practicals.


Now let’s see functions in action:

2.1. select()


Select the variables names and age


select(gbbo1, names, age, sex)

You can store the selected variables into a new dataframe

gbbo3<-select(gbbo1, names, age, sex)
View(gbbo3) # This allows you to see the dataset in a different tab

2.2. filter()


Now, filter (select) a subsample of gbbo participants younger than 30 and store them into a new dataframe

filter(gbbo3, age<30)
##     names age    sex
## 1 Kim-Joy  27 female
## 2   Manon  26 female
gbbo4<-filter(gbbo1, age<30)

2.3. join()


Before, we created two dataframes: one containing most of the data (gbbo1) and another containing only names and hometown (gbbo2). This is to recreate a typical situation in research, where you find that your dataset does not contain all the variables you’re interested in, but you have another dataset (or find one) that contains additional variables which you can link to your existing dataset by using an ID variable.

left_join(gbbo1, gbbo2, by = "names")
##      names age    sex                        occupation      hometown
## 1   Antony  30   male                            Banker        London
## 2   Briony  33 female                  Full-time parent       Bristol
## 3      Dan  36   male                  Full-time parent        London
## 4   Imelda  33 female    Countryside recreation officer County Tyrone
## 5      Jon  47   male                     Blood courier       Newport
## 6    Karen  60 female       In-store sampling assistant     Wakefield
## 7  Kim-Joy  27 female          Mental health specialist         Leeds
## 8     Luke  30   male Civil servant/house and techno DJ     Sheffield
## 9    Manon  26 female          Software project manager        London
## 10   Rahul  30   male                Research scientist     Rotherham
## 11    Ruby  30 female                   Project manager        London
## 12   Terry  56   male               Retired air steward West Midlands

Note 1: In this example we have been saving all the new datasets that we are creating. This is only done with the purpose of showing you the changes in the data after running the functions. But if you are working with big datasets, this is sometimes not a very good idea, since your R console will be populated with several datasets that are not being used.

gbbo_all<- left_join(gbbo1, gbbo2, by = "names")


Note 2: Whenever you are doing a join operation remember to always be dexterous and deft… and never confuse your right-hand side with your left 1


2.4. rename()


Using rename function to change variable names. Here we are changing the variable “hometown” to “city”

rename(gbbo_all, "city"="hometown")
##      names age    sex                        occupation          city
## 1   Antony  30   male                            Banker        London
## 2   Briony  33 female                  Full-time parent       Bristol
## 3      Dan  36   male                  Full-time parent        London
## 4   Imelda  33 female    Countryside recreation officer County Tyrone
## 5      Jon  47   male                     Blood courier       Newport
## 6    Karen  60 female       In-store sampling assistant     Wakefield
## 7  Kim-Joy  27 female          Mental health specialist         Leeds
## 8     Luke  30   male Civil servant/house and techno DJ     Sheffield
## 9    Manon  26 female          Software project manager        London
## 10   Rahul  30   male                Research scientist     Rotherham
## 11    Ruby  30 female                   Project manager        London
## 12   Terry  56   male               Retired air steward West Midlands

2.5. summarise()


Here we will get some descriptive statistics using the summarise function from dplyr. This function is only for numeric variables.

summarise(gbbo_all, mean(age))
##   mean(age)
## 1      36.5


summarise is very handy since it also allows us to save the summarised variable. You just need to specify a name before the requested statistics

summarise(gbbo_all, mean_age=mean(age))
##   mean_age
## 1     36.5


You can request more than one statistic and store them all

summarise(gbbo_all, mean_age=mean(age),
                    sd(age),
                    median(age))
##   mean_age  sd(age) median(age)
## 1     36.5 11.42963        31.5

2.6. group_by()


This function works by grouping according to a variable

group_by(gbbo_all, sex)
## # A tibble: 12 x 5
## # Groups:   sex [2]
##    names     age sex    occupation                        hometown     
##    <fct>   <dbl> <fct>  <fct>                             <fct>        
##  1 Antony     30 male   Banker                            London       
##  2 Briony     33 female Full-time parent                  Bristol      
##  3 Dan        36 male   Full-time parent                  London       
##  4 Imelda     33 female Countryside recreation officer    County Tyrone
##  5 Jon        47 male   Blood courier                     Newport      
##  6 Karen      60 female In-store sampling assistant       Wakefield    
##  7 Kim-Joy    27 female Mental health specialist          Leeds        
##  8 Luke       30 male   Civil servant/house and techno DJ Sheffield    
##  9 Manon      26 female Software project manager          London       
## 10 Rahul      30 male   Research scientist                Rotherham    
## 11 Ruby       30 female Project manager                   London       
## 12 Terry      56 male   Retired air steward               West Midlands


As you can see, group by does not seem to do anything. This is because it works in combination with other functions, for instance: summarise.
Let’s save the group under a new dataset

bysex<-group_by(gbbo_all, sex) 


And now, let’s use this new dataset to get an indicator of the average age by sex of the participants.

summarise(bysex, age_mean=mean(age))
## # A tibble: 2 x 2
##   sex    age_mean
##   <fct>     <dbl>
## 1 female     34.8
## 2 male       38.2


We have created a new aggregated variable age_mean that takes the mean of the variable age according to sex. ***

3. Piping



When you search for examples using dplyr on the web, you are very likely to encounter this symbol %>% called “pipe”. We are not covering this in full detail, but below is an example of what it is and how to use it.


Pipes are meant to make the coding easy to write and read. It writes the code following a logical set of instructions. This is an example of the last code we used, but now rewritten with pipes


gbbo_all %>%                      # Take the data 
  group_by(sex) %>%               # Now group it by sex
  summarise(age_mean=mean(age))   # This is to create our aggregated variable, all in one go!
## # A tibble: 2 x 2
##   sex    age_mean
##   <fct>     <dbl>
## 1 female     34.8
## 2 male       38.2


If you are going to be using a summary like the above many times during your analysis, you can save it as a new object. It would help you avoid running the code over and over again. To do this, simply give it a name and use the assign arrow “<-”.


summary_gbbo <- gbbo_all %>%
  group_by(sex) %>%   
  summarise(age_mean=mean(age))

summary_gbbo # this is to print the results on the console
## # A tibble: 2 x 2
##   sex    age_mean
##   <fct>     <dbl>
## 1 female     34.8
## 2 male       38.2

4. Plotting


To plot we can use the base package, but much nicer plots can be produced by using the package “ggplot2”. Let’s load it (you may need to install it if not available)


Now do a simple bar chart with the ages of GBBO participants:

ggplot(gbbo_all, aes(age)) + geom_bar()


As you can see the bar chart above isn’t terribly informative, so you can do an alternative plot with summary statistics. You can embed the code with the pipes from before and then run the plot command, as such:

ggplot(gbbo_all %>%                           
  group_by(sex) %>%
  summarise(age_mean=mean(age)), 
  aes(y=age_mean, x=sex)) + 
  geom_bar(stat = "identity") # we need to specify stat="identity" for the value itself to be plotted


Perhaps a much simpler option would have been to save the command with pipes as a new dataframe, as such:

mean_by_sex<-gbbo_all %>%                           
  group_by(sex) %>%
  summarise(age_mean=mean(age))


And then run the plot with the saved summary dataframe:


ggplot(mean_by_sex, aes(y=age_mean, x=sex)) + geom_bar(stat = "identity")



Final comments

There are many online resources to learn R. Here are some you can use:

http://www.cookbook-r.com/
https://www.statmethods.net/
https://www.datacamp.com/
https://r4ds.had.co.nz/
https://rstudio.com/resources/webinars/
Click this if you like R and giraffes… and tea


Remember that you never finish learning R, sometimes R users feel like all we do is get better at googling our questions.



  1. Does this ring a bell? It’s inspired by Dr. Seuss’ “Oh, the places you’ll go!”

LS0tDQp0aXRsZTogIkRlbW8gdXNpbmcgZGF0YSBmcm9tIEdyZWF0IEJyaXRpc2ggQmFrZSBPZmYgMjAxOCA8aW1nIHNyYz1cInNlbWluYXJzX2xvZ28ucG5nXCIgd2lkdGg9XCIyMDBcIiBoZWlnaHQ9XCI1MFwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0O1wiLz4iDQphdXRob3I6ICJBbmEgTW9yYWxlcy1Hw7NtZXogYW5kIFBhdHJpY2lvIFRyb25jb3NvIg0KZGF0ZTogIkxhdGVzdCB1cGRhdGU6IEZlYnJ1YXJ5IDIwMjAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgIGhpZ2hsaWdodGVyOiBudWxsDQogICB0aGVtZTogY29zbW8NCiAgIHRvYzogeWVzDQogICB0b2NfZGVwdGg6IDQNCiAgIHRvY19mbG9hdDogeWVzDQogICBmb250c2l6ZTogMTJwdA0KICAgaW5jbHVkZXM6DQogICAgICNpbl9oZWFkZXI6IGhlYWRlci5odG1sDQogICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sDQogICAgICANCi0tLQ0KDQpUaGlzIGV4YW1wbGUgd2lsbCBkZW1vbnN0cmF0ZSB0aGUgbWFpbiBmdW5jdGlvbnMgb2YgdGhlIHBhY2thZ2UgKipkcGx5cioqLiBXZSB3aWxsIGJlIHVzaW5nIChwdWJsaWNhbGx5IGF2YWlsYWJsZSkgZGF0YSBvZiB0aGUgcGFydGljaXBhbnRzIG9mIHRoZSBHcmVhdCBCcml0aXNoIEJha2UgT2ZmIDIwMTguDQoNCkZpcnN0IHdlIG5lZWQgdG8gbG9hZCBkcGx5ciBpbnRvIFINCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCiMjIDEuIENyZWF0ZSB5b3VyIG93biBkYXRhc2V0IGZyb20gc2NyYXRjaA0KDQpIZXJlIHdlIGFyZSBjcmVhdGluZyBmcmVlIHZhcmlhYmxlcyAodmVjdG9ycyBpbiBSKQ0KPGJyPg0KDQpgYGB7cn0NCm5hbWVzIDwtIGMoIkFudG9ueSIsICJCcmlvbnkiLCAiRGFuIiwiSW1lbGRhIiwgIkpvbiIsICJLYXJlbiIsIktpbS1Kb3kiLCJMdWtlIiwiTWFub24iLCAiUmFodWwiLCAiUnVieSIgLCJUZXJyeSIpDQoNCnNleCA8LSBjKCJtYWxlIiwgImZlbWFsZSIsIm1hbGUiLCAiZmVtYWxlIiwgIm1hbGUiLCAiZmVtYWxlIiwgImZlbWFsZSIsIm1hbGUiLCAiZmVtYWxlIiwgIm1hbGUiLCAiZmVtYWxlIiwgIm1hbGUiKQ0KDQpob21ldG93biA8LSBjKCJMb25kb24iLCAiQnJpc3RvbCIsICJMb25kb24iLCAiQ291bnR5IFR5cm9uZSIsICJOZXdwb3J0IiwiV2FrZWZpZWxkIiwgIkxlZWRzIiwgIlNoZWZmaWVsZCIsICJMb25kb24iLCAiUm90aGVyaGFtIiwiTG9uZG9uIiwgIldlc3QgTWlkbGFuZHMiKQ0KDQpvY2N1cGF0aW9uIDwtIGMoIkJhbmtlciIsICJGdWxsLXRpbWUgcGFyZW50IiwgIkZ1bGwtdGltZSBwYXJlbnQiLCAiQ291bnRyeXNpZGUgcmVjcmVhdGlvbiBvZmZpY2VyIiwgIkJsb29kIGNvdXJpZXIiLCAiSW4tc3RvcmUgc2FtcGxpbmcgYXNzaXN0YW50IiwgIk1lbnRhbCBoZWFsdGggc3BlY2lhbGlzdCIsIkNpdmlsIHNlcnZhbnQvaG91c2UgYW5kIHRlY2hubyBESiIsICJTb2Z0d2FyZSBwcm9qZWN0IG1hbmFnZXIiLCAiUmVzZWFyY2ggc2NpZW50aXN0IiwgIlByb2plY3QgbWFuYWdlciIsICJSZXRpcmVkIGFpciBzdGV3YXJkIikNCg0KYWdlIDwtIGMoMzAsIDMzLCAzNiwgMzMsIDQ3LCA2MCwgMjcsIDMwLCAyNiwgMzAsIDMwLCA1NikNCmBgYA0KPGJyPg0KQW5kIG5vdyB3ZSdsbCBjcmVhdGUgdHdvIGRhdGFmcmFtZXMgdXNpbmcgdGhlIGFib3ZlIHZhcmlhYmxlcw0KPGJyPg0KYGBge3J9DQpnYmJvMTwtZGF0YS5mcmFtZShuYW1lcywgYWdlLCBzZXgsIG9jY3VwYXRpb24pDQpnYmJvMjwtZGF0YS5mcmFtZShuYW1lcywgaG9tZXRvd24pDQpgYGANCg0KKioqDQojIyAyLiBGcmVxdWVudGx5IHVzZWQgImRwbHlyIiBmdW5jdGlvbnMNCg0KVGhlc2UgZnVuY3Rpb25zIGFyZSBzb21lIG9mIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCwgYnV0IG9idmlvdXNseSBub3QgdGhlIG9ubHkgb25lcy4gImRwbHlyIiBpcyBwYXJ0IG9mIHRoZSAidGlkeXZlcnNlIiwgd2hpY2ggaXMgaHVnZSBjb2xsZWN0aW9uIG9mIHBhY2thZ2VzLiAiZHBseXIiIGlzIHVzZWQgZm9yIGRhdGEgbWFuaXB1bGF0aW9uLCB3aGljaCBjYW4gYmUgYSB3aG9sZSBjb3Vyc2UgaW4gaXRzIG93biByaWdodC4gSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gdGhpcyB0b3BpYyBhbmQgd2FudCB0byBsZWFybiBtb3JlLCB5b3UgY2FuIGhhdmUgYSBsb29rIGF0IHRoZXNlIFtzbGlkZXNdKGh0dHBzOi8vdWtkYXRhc2VydmljZS5hYy51ay9tZWRpYS82MjI1MTkvc2xpZGVzLnBkZikgYW5kIHRoZSBhY2NvbXBhbnlpbmcgW3ByYWN0aWNhbHNdKGh0dHBzOi8vdWtkYXRhc2VydmljZS5hYy51ay9uZXdzLWFuZC1ldmVudHMvZXZlbnRzaXRlbS8/aWQ9NTQ5OCkuDQoNCjxicj4NCk5vdyBsZXQncyBzZWUgZnVuY3Rpb25zIGluIGFjdGlvbjoNCg0KIyMjIDIuMS4gc2VsZWN0KCkNCjxicj4NCg0KU2VsZWN0IHRoZSB2YXJpYWJsZXMgbmFtZXMgYW5kIGFnZQ0KDQo8YnI+DQpgYGB7ciwgZXZhbD1GQUxTRX0NCnNlbGVjdChnYmJvMSwgbmFtZXMsIGFnZSwgc2V4KQ0KYGBgDQoNCllvdSBjYW4gc3RvcmUgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcyBpbnRvIGEgbmV3IGRhdGFmcmFtZSANCg0KYGBge3J9DQpnYmJvMzwtc2VsZWN0KGdiYm8xLCBuYW1lcywgYWdlLCBzZXgpDQpWaWV3KGdiYm8zKSAjIFRoaXMgYWxsb3dzIHlvdSB0byBzZWUgdGhlIGRhdGFzZXQgaW4gYSBkaWZmZXJlbnQgdGFiDQpgYGANCioqKg0KIyMjIDIuMi4gZmlsdGVyKCkNCjxicj4NCk5vdywgZmlsdGVyIChzZWxlY3QpIGEgc3Vic2FtcGxlIG9mIGdiYm8gcGFydGljaXBhbnRzIHlvdW5nZXIgdGhhbiAzMCBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgbmV3IGRhdGFmcmFtZQ0KDQpgYGB7cn0NCmZpbHRlcihnYmJvMywgYWdlPDMwKQ0KDQpnYmJvNDwtZmlsdGVyKGdiYm8xLCBhZ2U8MzApDQpgYGANCioqKg0KIyMjIDIuMy4gam9pbigpDQo8YnI+DQpCZWZvcmUsIHdlIGNyZWF0ZWQgdHdvIGRhdGFmcmFtZXM6IG9uZSBjb250YWluaW5nIG1vc3Qgb2YgdGhlIGRhdGEgKGdiYm8xKSBhbmQgYW5vdGhlciBjb250YWluaW5nIG9ubHkgbmFtZXMgYW5kIGhvbWV0b3duIChnYmJvMikuIFRoaXMgaXMgdG8gcmVjcmVhdGUgYSB0eXBpY2FsIHNpdHVhdGlvbiBpbiByZXNlYXJjaCwgd2hlcmUgeW91IGZpbmQgdGhhdCB5b3VyIGRhdGFzZXQgZG9lcyBub3QgY29udGFpbiBhbGwgdGhlIHZhcmlhYmxlcyB5b3UncmUgaW50ZXJlc3RlZCBpbiwgYnV0IHlvdSBoYXZlIGFub3RoZXIgZGF0YXNldCAob3IgZmluZCBvbmUpIHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgd2hpY2ggeW91IGNhbiBsaW5rIHRvIHlvdXIgZXhpc3RpbmcgZGF0YXNldCBieSB1c2luZyBhbiBJRCB2YXJpYWJsZS4NCjxicj4NCmBgYHtyfQ0KbGVmdF9qb2luKGdiYm8xLCBnYmJvMiwgYnkgPSAibmFtZXMiKQ0KYGBgDQoqKioNCioqTm90ZSAxKio6IEluIHRoaXMgZXhhbXBsZSB3ZSBoYXZlIGJlZW4gc2F2aW5nIGFsbCB0aGUgbmV3IGRhdGFzZXRzIHRoYXQgd2UgYXJlIGNyZWF0aW5nLiBUaGlzIGlzIG9ubHkgZG9uZSB3aXRoIHRoZSBwdXJwb3NlIG9mIHNob3dpbmcgeW91IHRoZSBjaGFuZ2VzIGluIHRoZSBkYXRhIGFmdGVyIHJ1bm5pbmcgdGhlIGZ1bmN0aW9ucy4gQnV0IGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIGJpZyBkYXRhc2V0cywgdGhpcyBpcyBzb21ldGltZXMgbm90IGEgdmVyeSBnb29kIGlkZWEsIHNpbmNlIHlvdXIgUiBjb25zb2xlIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggc2V2ZXJhbCBkYXRhc2V0cyB0aGF0IGFyZSBub3QgYmVpbmcgdXNlZC4NCmBgYHtyfQ0KZ2Jib19hbGw8LSBsZWZ0X2pvaW4oZ2JibzEsIGdiYm8yLCBieSA9ICJuYW1lcyIpDQpgYGANCjxicj4NCg0KKipOb3RlIDIqKjogV2hlbmV2ZXIgeW91IGFyZSBkb2luZyBhICoqam9pbioqIG9wZXJhdGlvbiByZW1lbWJlciB0byBhbHdheXMgYmUgZGV4dGVyb3VzIGFuZCBkZWZ0Li4uIGFuZCBuZXZlciBjb25mdXNlIHlvdXIgcmlnaHQtaGFuZCBzaWRlIHdpdGggeW91ciBsZWZ0IFteMV0gDQoNCioqKg0KIyMjIDIuNC4gcmVuYW1lKCkNCjxicj4NClVzaW5nIGByZW5hbWVgIGZ1bmN0aW9uIHRvIGNoYW5nZSB2YXJpYWJsZSBuYW1lcy4gSGVyZSB3ZSBhcmUgY2hhbmdpbmcgdGhlIHZhcmlhYmxlICJob21ldG93biIgdG8gImNpdHkiDQo8YnI+DQpgYGB7cn0NCnJlbmFtZShnYmJvX2FsbCwgImNpdHkiPSJob21ldG93biIpDQpgYGANCioqKg0KIyMjIDIuNS4gc3VtbWFyaXNlKCkgDQo8YnI+DQpIZXJlIHdlIHdpbGwgZ2V0IHNvbWUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB1c2luZyB0aGUgYHN1bW1hcmlzZWAgZnVuY3Rpb24gZnJvbSBgZHBseXJgLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIG51bWVyaWMgdmFyaWFibGVzLiANCjxicj4NCmBgYHtyfQ0Kc3VtbWFyaXNlKGdiYm9fYWxsLCBtZWFuKGFnZSkpDQpgYGANCjxicj4NCmBzdW1tYXJpc2VgIGlzIHZlcnkgaGFuZHkgc2luY2UgaXQgYWxzbyBhbGxvd3MgdXMgdG8gc2F2ZSB0aGUgc3VtbWFyaXNlZCB2YXJpYWJsZS4gWW91IGp1c3QgbmVlZCB0byBzcGVjaWZ5IGEgbmFtZSBiZWZvcmUgdGhlIHJlcXVlc3RlZCBzdGF0aXN0aWNzDQo8YnI+DQpgYGB7cn0NCnN1bW1hcmlzZShnYmJvX2FsbCwgbWVhbl9hZ2U9bWVhbihhZ2UpKQ0KYGBgDQo8YnI+DQpZb3UgY2FuIHJlcXVlc3QgbW9yZSB0aGFuIG9uZSBzdGF0aXN0aWMgYW5kIHN0b3JlIHRoZW0gYWxsDQo8YnI+DQpgYGB7cn0NCnN1bW1hcmlzZShnYmJvX2FsbCwgbWVhbl9hZ2U9bWVhbihhZ2UpLA0KICAgICAgICAgICAgICAgICAgICBzZChhZ2UpLA0KICAgICAgICAgICAgICAgICAgICBtZWRpYW4oYWdlKSkNCmBgYA0KKioqDQojIyMgMi42LiBncm91cF9ieSgpDQo8YnI+DQpUaGlzIGZ1bmN0aW9uIHdvcmtzIGJ5IGdyb3VwaW5nIGFjY29yZGluZyB0byBhIHZhcmlhYmxlDQo8YnI+DQpgYGB7cn0NCmdyb3VwX2J5KGdiYm9fYWxsLCBzZXgpDQpgYGANCjxicj4NCkFzIHlvdSBjYW4gc2VlLCBgZ3JvdXAgYnlgIGRvZXMgbm90IHNlZW0gdG8gZG8gYW55dGhpbmcuIFRoaXMgaXMgYmVjYXVzZSBpdCB3b3JrcyBpbiBjb21iaW5hdGlvbiB3aXRoIG90aGVyIGZ1bmN0aW9ucywgZm9yIGluc3RhbmNlOiBgc3VtbWFyaXNlYC4NCjxicj4NCkxldCdzIHNhdmUgdGhlIGdyb3VwIHVuZGVyIGEgbmV3IGRhdGFzZXQNCjxicj4NCmBgYHtyfQ0KYnlzZXg8LWdyb3VwX2J5KGdiYm9fYWxsLCBzZXgpIA0KYGBgDQo8YnI+DQpBbmQgbm93LCBsZXQncyB1c2UgdGhpcyBuZXcgZGF0YXNldCB0byBnZXQgYW4gaW5kaWNhdG9yIG9mIHRoZSBhdmVyYWdlIGFnZSBieSBzZXggb2YgdGhlIHBhcnRpY2lwYW50cy4NCjxicj4NCmBgYHtyfQ0Kc3VtbWFyaXNlKGJ5c2V4LCBhZ2VfbWVhbj1tZWFuKGFnZSkpDQpgYGANCjxicj4NCldlIGhhdmUgY3JlYXRlZCBhIG5ldyBhZ2dyZWdhdGVkIHZhcmlhYmxlICoqYWdlX21lYW4qKiB0aGF0IHRha2VzIHRoZSBtZWFuIG9mIHRoZSB2YXJpYWJsZSBhZ2UgYWNjb3JkaW5nIHRvIHNleC4gDQoqKioNCg0KIyMgMy4gUGlwaW5nDQo8YnI+DQo8Y2VudGVyPg0KIVtdKGh0dHBzOi8vbWVkaWEuZ2lwaHkuY29tL21lZGlhL2wxd2pvNXJWRkhyU0UvZ2lwaHkuZ2lmKQ0KPC9jZW50ZXI+DQoNCjxicj4NCldoZW4geW91IHNlYXJjaCBmb3IgZXhhbXBsZXMgdXNpbmcgKipkcGx5cioqIG9uIHRoZSB3ZWIsIHlvdSBhcmUgdmVyeSBsaWtlbHkgdG8gZW5jb3VudGVyIHRoaXMgc3ltYm9sICoqJT4lKiogY2FsbGVkICJwaXBlIi4gV2UgYXJlIG5vdCBjb3ZlcmluZyB0aGlzIGluIGZ1bGwgZGV0YWlsLCBidXQgYmVsb3cgaXMgYW4gZXhhbXBsZSBvZiB3aGF0IGl0IGlzIGFuZCBob3cgdG8gdXNlIGl0Lg0KDQo8YnI+DQpQaXBlcyBhcmUgbWVhbnQgdG8gbWFrZSB0aGUgY29kaW5nIGVhc3kgdG8gd3JpdGUgYW5kIHJlYWQuIEl0IHdyaXRlcyB0aGUgY29kZSBmb2xsb3dpbmcgYSBsb2dpY2FsIHNldCBvZiBpbnN0cnVjdGlvbnMuIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB0aGUgbGFzdCBjb2RlIHdlIHVzZWQsIGJ1dCBub3cgcmV3cml0dGVuIHdpdGggcGlwZXMNCg0KPGJyPg0KYGBge3J9DQpnYmJvX2FsbCAlPiUgICAgICAgICAgICAgICAgICAgICAgIyBUYWtlIHRoZSBkYXRhIA0KICBncm91cF9ieShzZXgpICU+JSAgICAgICAgICAgICAgICMgTm93IGdyb3VwIGl0IGJ5IHNleA0KICBzdW1tYXJpc2UoYWdlX21lYW49bWVhbihhZ2UpKSAgICMgVGhpcyBpcyB0byBjcmVhdGUgb3VyIGFnZ3JlZ2F0ZWQgdmFyaWFibGUsIGFsbCBpbiBvbmUgZ28hDQpgYGANCjxicj4NCg0KSWYgeW91IGFyZSBnb2luZyB0byBiZSB1c2luZyBhIHN1bW1hcnkgbGlrZSB0aGUgYWJvdmUgbWFueSB0aW1lcyBkdXJpbmcgeW91ciBhbmFseXNpcywgeW91IGNhbiBzYXZlIGl0IGFzIGEgbmV3IG9iamVjdC4gSXQgd291bGQgaGVscCB5b3UgYXZvaWQgcnVubmluZyB0aGUgY29kZSBvdmVyIGFuZCBvdmVyIGFnYWluLiBUbyBkbyB0aGlzLCBzaW1wbHkgZ2l2ZSBpdCBhIG5hbWUgYW5kIHVzZSB0aGUgYXNzaWduIGFycm93ICI8LSIuIA0KDQo8YnI+DQpgYGB7cn0NCnN1bW1hcnlfZ2JibyA8LSBnYmJvX2FsbCAlPiUNCiAgZ3JvdXBfYnkoc2V4KSAlPiUgICANCiAgc3VtbWFyaXNlKGFnZV9tZWFuPW1lYW4oYWdlKSkNCg0Kc3VtbWFyeV9nYmJvICMgdGhpcyBpcyB0byBwcmludCB0aGUgcmVzdWx0cyBvbiB0aGUgY29uc29sZQ0KYGBgDQoNCioqKg0KDQojIyA0LiBQbG90dGluZw0KDQpgYGB7ciwgZWNobz1GLCBmaWcuYWxpZ249ImNlbnRlciIsIG91dC53aWR0aD0iMzAwcHgiLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJ0cmFqZWN0b3JpZXMuZ2lmIikNCg0KYGBgDQo8YnI+DQpUbyBwbG90IHdlIGNhbiB1c2UgdGhlIGJhc2UgcGFja2FnZSwgYnV0IG11Y2ggbmljZXIgcGxvdHMgY2FuIGJlIHByb2R1Y2VkIGJ5IHVzaW5nIHRoZSBwYWNrYWdlICJnZ3Bsb3QyIi4gTGV0J3MgbG9hZCBpdCAoeW91IG1heSBuZWVkIHRvIGluc3RhbGwgaXQgaWYgbm90IGF2YWlsYWJsZSkNCjxicj4NCmBgYHtyLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgZWNobz1GfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQo8YnI+DQpOb3cgZG8gYSBzaW1wbGUgYmFyIGNoYXJ0IHdpdGggdGhlIGFnZXMgb2YgR0JCTyBwYXJ0aWNpcGFudHM6DQo8YnI+DQpgYGB7cn0NCmdncGxvdChnYmJvX2FsbCwgYWVzKGFnZSkpICsgZ2VvbV9iYXIoKQ0KYGBgDQo8YnI+DQpBcyB5b3UgY2FuIHNlZSB0aGUgYmFyIGNoYXJ0IGFib3ZlIGlzbid0IHRlcnJpYmx5IGluZm9ybWF0aXZlLCBzbyB5b3UgY2FuIGRvIGFuIGFsdGVybmF0aXZlIHBsb3Qgd2l0aCBzdW1tYXJ5IHN0YXRpc3RpY3MuIFlvdSBjYW4gZW1iZWQgdGhlIGNvZGUgd2l0aCB0aGUgcGlwZXMgZnJvbSBiZWZvcmUgYW5kIHRoZW4gcnVuIHRoZSBwbG90IGNvbW1hbmQsIGFzIHN1Y2g6DQo8YnI+DQpgYGB7cn0NCmdncGxvdChnYmJvX2FsbCAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZ3JvdXBfYnkoc2V4KSAlPiUNCiAgc3VtbWFyaXNlKGFnZV9tZWFuPW1lYW4oYWdlKSksIA0KICBhZXMoeT1hZ2VfbWVhbiwgeD1zZXgpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgIyB3ZSBuZWVkIHRvIHNwZWNpZnkgc3RhdD0iaWRlbnRpdHkiIGZvciB0aGUgdmFsdWUgaXRzZWxmIHRvIGJlIHBsb3R0ZWQNCmBgYA0KPGJyPg0KUGVyaGFwcyBhIG11Y2ggc2ltcGxlciBvcHRpb24gd291bGQgaGF2ZSBiZWVuIHRvIHNhdmUgdGhlIGNvbW1hbmQgd2l0aCBwaXBlcyBhcyBhIG5ldyBkYXRhZnJhbWUsIGFzIHN1Y2g6DQo8YnI+DQpgYGB7cn0NCm1lYW5fYnlfc2V4PC1nYmJvX2FsbCAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZ3JvdXBfYnkoc2V4KSAlPiUNCiAgc3VtbWFyaXNlKGFnZV9tZWFuPW1lYW4oYWdlKSkNCmBgYA0KPGJyPg0KDQpBbmQgdGhlbiBydW4gdGhlIHBsb3Qgd2l0aCB0aGUgc2F2ZWQgc3VtbWFyeSBkYXRhZnJhbWU6DQoNCjxicj4NCmBgYHtyfQ0KZ2dwbG90KG1lYW5fYnlfc2V4LCBhZXMoeT1hZ2VfbWVhbiwgeD1zZXgpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKQ0KYGBgDQoNCjxicj4NCg0KKioqDQoNCiMjIEZpbmFsIGNvbW1lbnRzDQoNClRoZXJlIGFyZSAqbWFueSogb25saW5lIHJlc291cmNlcyB0byBsZWFybiBSLiBIZXJlIGFyZSBzb21lIHlvdSBjYW4gdXNlOg0KDQpodHRwOi8vd3d3LmNvb2tib29rLXIuY29tLw0KPGJyPg0KaHR0cHM6Ly93d3cuc3RhdG1ldGhvZHMubmV0Lw0KPGJyPg0KaHR0cHM6Ly93d3cuZGF0YWNhbXAuY29tLw0KPGJyPg0KaHR0cHM6Ly9yNGRzLmhhZC5jby5uei8NCjxicj4NCmh0dHBzOi8vcnN0dWRpby5jb20vcmVzb3VyY2VzL3dlYmluYXJzLw0KPGJyPg0KWyoqQ2xpY2sgdGhpcyBpZiB5b3UgbGlrZSBSIGFuZCBnaXJhZmZlcy4uLiBhbmQgdGVhKipdKGh0dHBzOi8vdGlueXN0YXRzLmdpdGh1Yi5pby90ZWFjdXBzLWdpcmFmZmVzLWFuZC1zdGF0aXN0aWNzL2luZGV4Lmh0bWwpDQoNCjxicj4NCg0KUmVtZW1iZXIgdGhhdCB5b3UgbmV2ZXIgZmluaXNoIGxlYXJuaW5nIFIsIHNvbWV0aW1lcyBSIHVzZXJzIGZlZWwgbGlrZSBhbGwgd2UgZG8gaXMgZ2V0IGJldHRlciBhdCBnb29nbGluZyBvdXIgcXVlc3Rpb25zLg0KDQo8YnI+DQo8Y2VudGVyPg0KIVtdKGh0dHBzOi8vbWVkaWEuZ2lwaHkuY29tL21lZGlhLzEyeFNyd0t4SHhCM0JTL2dpcGh5LmdpZikNCjwvY2VudGVyPg0KDQoNClteMV06IERvZXMgdGhpcyByaW5nIGEgYmVsbD8gSXQncyBpbnNwaXJlZCBieSBEci4gU2V1c3MnICJPaCwgdGhlIHBsYWNlcyB5b3UnbGwgZ28hIg==
 

Patricio Troncoso

patricio.troncoso@manchester.ac.uk