Импорт донных для заданий

  girls.textdata= 
  "row.name|name|age|hobby|height
  g1|Лена|19|лыжи|166
  g2|Жанна|22|вышивка|156,5
  g3|Даша|29|лыжи|180
  g4|Ира|26|танцы|170 
  g5|Зина|16|танцы|160" 
girls <- read.delim(header=T,
  sep="|" , dec = ",",
  text= girls.textdata,
  row.names = 1, 
  stringsAsFactors = F
  )
boys.textdata= 
  "row.name|name|age|hobby|height
  b1|Гена|19|лыжи|188
  b2|Женя|32|мотоцикл|166,5
  b3|Саша|29|лыжи|180
  b4|Дима|26|танцы|170" 
boys <- read.delim(header=T,
  sep="|" , dec = ",",
  text= boys.textdata,
  row.names = 1, 
  stringsAsFactors = F
  )
url_world_data <- "http://crow.academy.ru/~ikocherg/stud_do/2015vesna/world.txt.zip"
download.file(url_world_data,destfile = "data/world.txt.zip")
unzip("data/world.txt.zip",exdir = "data")
city <- read.csv2("data/city.txt",as.is=T)
country <- read.csv2("data/country.txt",as.is=T)

Шпаргалка по пакету находится в разделе шпаргалок RStudio под именем Data Wrangling Cheat Sheet

library(dplyr)
## Warning: package 'dplyr' was built under R version 3.1.3

Преобразуем фреймы данных в усовершенстованные (local data frame), которые поддерживает пакет dplyr.

city_t <- tbl_df(city)
country_t <- tbl_df(country)

Загруженные таблицы

База world

city_t
## Source: local data frame [4,079 x 5]
## 
##    CityID           Name CountryCode      District Population
##     (int)          (chr)       (chr)         (chr)      (int)
## 1       1          Kabul         AFG         Kabol    1780000
## 2       2       Qandahar         AFG      Qandahar     237500
## 3       3          Herat         AFG         Herat     186800
## 4       4 Mazar-e-Sharif         AFG         Balkh     127800
## 5       5      Amsterdam         NLD Noord-Holland     731200
## 6       6      Rotterdam         NLD  Zuid-Holland     593321
## 7       7           Haag         NLD  Zuid-Holland     440900
## 8       8        Utrecht         NLD       Utrecht     234323
## 9       9      Eindhoven         NLD Noord-Brabant     201843
## 10     10        Tilburg         NLD Noord-Brabant     193238
## ..    ...            ...         ...           ...        ...
country_t
## Source: local data frame [239 x 15]
## 
##    CountryCode                 Name     Continent
##          (chr)                (chr)         (chr)
## 1          ABW                Aruba North America
## 2          AFG          Afghanistan          Asia
## 3          AGO               Angola        Africa
## 4          AIA             Anguilla North America
## 5          ALB              Albania        Europe
## 6          AND              Andorra        Europe
## 7          ANT Netherlands Antilles North America
## 8          ARE United Arab Emirates          Asia
## 9          ARG            Argentina South America
## 10         ARM              Armenia          Asia
## ..         ...                  ...           ...
## Variables not shown: Region (chr), SurfaceArea (dbl), IndepYear (int),
##   Population (int), LifeExpectancy (dbl), GNP (dbl), GNPOld (dbl),
##   LocalName (chr), GovernmentForm (chr), HeadOfState (chr), Capital (int),
##   Code2 (chr)

База бабушек у подъезда

girls
##       name age   hobby height
##   g1  Лена  19    лыжи  166.0
##   g2 Жанна  22 вышивка  156.5
##   g3  Даша  29    лыжи  180.0
##   g4   Ира  26   танцы  170.0
##   g5  Зина  16   танцы  160.0
boys
##      name age    hobby height
##   b1 Гена  19     лыжи  188.0
##   b2 Женя  32 мотоцикл  166.5
##   b3 Саша  29     лыжи  180.0
##   b4 Дима  26    танцы  170.0

Практические задания

Задание 1 Бабушки на лавочке у подъезда хотят обсудить возможные пары девочек и мальчиков из их подъезда. Они решили рассмотреть пары с общими хобби и добавили еще дополнительные фильтры : разница в возрасте не должна превышать 6 лет и выстота девушки должна быть строго меньше высоты юноши. Запрос должен выдать такой результат:

inner_join(x = girls,y=boys,by=c("hobby")) %>% 
  filter(abs(age.x-age.y) <=6 , height.x<height.y)
##   name.x age.x hobby height.x name.y age.y height.y
## 1   Лена    19  лыжи      166   Гена    19      188

Задание 2 Показать страны, удовлетворяющие условию Region==“Baltic Countries” упорядочив их по убыванию населения (Population). Выдайте только столбцы Name, Population, SurfaceArea. Ожидаемый результат:

country_t %>% 
  filter(Region=="Baltic Countries") %>% 
  arrange(desc(Population)) %>% 
  select(Name,Population,SurfaceArea)
## Source: local data frame [3 x 3]
## 
##        Name Population SurfaceArea
##       (chr)      (int)       (dbl)
## 1 Lithuania    3698500       65301
## 2    Latvia    2424200       64589
## 3   Estonia    1439200       45227

Задание 3 Соедините таблицы city (city_t) и country (country_t) по полю CountryCode. Выдайте только информацию про те города, где население города (Population.x) больше чем количество граждан стран, в которой он расположен (Population.y). Выдайте в результат только столбцы, в имена которых содержат (containts() ) строки “Population”, “Name”. Ожидаемый результат:

inner_join(city_t,country_t,by=c("CountryCode" = "CountryCode")) %>% 
  filter(Population.x>Population.y) %>% 
  select(contains("Population"), contains("Name"))
## Source: local data frame [2 x 5]
## 
##   Population.x Population.y    Name.x    Name.y
##          (int)        (int)     (chr)     (chr)
## 1        27025        25000 Gibraltar Gibraltar
## 2      4017733      3567000 Singapore Singapore
## Variables not shown: LocalName (chr)

Задание 4 Узнайте, сколько крупных городов (city) на каждом континенте и сколько суммарно людей живет в городах. Ожидаемый результат:

inner_join(city_t,country_t,by="CountryCode") %>% 
  group_by(Continent) %>% 
  summarize(TotalCityPopulation=sum(Population.x),TotalCityCount=n()) 
## Source: local data frame [6 x 3]
## 
##       Continent TotalCityPopulation TotalCityCount
##           (chr)               (int)          (int)
## 1        Africa           135838579            366
## 2          Asia           697604103           1766
## 3        Europe           241942813            841
## 4 North America           168250381            581
## 5       Oceania            13886149             55
## 6 South America           172037859            470

Задание 5 ВЫдайте 5 самых больших по населению столиц Европы

inner_join(city_t,country_t,by=c("CityID"="Capital")) %>% 
  filter(Continent=="Europe") %>%
  arrange(desc(Population.x)) %>% 
  head(5) %>%
  select(Name.x,Population.x,Name.y)
## Source: local data frame [5 x 3]
## 
##   Name.x Population.x             Name.y
##    (chr)        (int)              (chr)
## 1 Moscow      8389200 Russian Federation
## 2 London      7285000     United Kingdom
## 3 Berlin      3386667            Germany
## 4 Madrid      2879052              Spain
## 5   Roma      2643581              Italy

Другие типы join

Inner join

girls
##       name age   hobby height
##   g1  Лена  19    лыжи  166.0
##   g2 Жанна  22 вышивка  156.5
##   g3  Даша  29    лыжи  180.0
##   g4   Ира  26   танцы  170.0
##   g5  Зина  16   танцы  160.0
boys
##      name age    hobby height
##   b1 Гена  19     лыжи  188.0
##   b2 Женя  32 мотоцикл  166.5
##   b3 Саша  29     лыжи  180.0
##   b4 Дима  26    танцы  170.0
inner_join(x=girls,y=boys,by="hobby")
##   name.x age.x hobby height.x name.y age.y height.y
## 1   Лена    19  лыжи      166   Гена    19      188
## 2   Лена    19  лыжи      166   Саша    29      180
## 3   Даша    29  лыжи      180   Гена    19      188
## 4   Даша    29  лыжи      180   Саша    29      180
## 5    Ира    26 танцы      170   Дима    26      170
## 6   Зина    16 танцы      160   Дима    26      170

Outer joins

left_join(x=girls,y=boys,by="hobby")
##   name.x age.x   hobby height.x name.y age.y height.y
## 1   Лена    19    лыжи    166.0   Гена    19      188
## 2   Лена    19    лыжи    166.0   Саша    29      180
## 3  Жанна    22 вышивка    156.5   <NA>    NA       NA
## 4   Даша    29    лыжи    180.0   Гена    19      188
## 5   Даша    29    лыжи    180.0   Саша    29      180
## 6    Ира    26   танцы    170.0   Дима    26      170
## 7   Зина    16   танцы    160.0   Дима    26      170
right_join(x=girls,y=boys,by="hobby")
##   name.x age.x    hobby height.x name.y age.y height.y
## 1   Лена    19     лыжи      166   Гена    19    188.0
## 2   Даша    29     лыжи      180   Гена    19    188.0
## 3   <NA>    NA мотоцикл       NA   Женя    32    166.5
## 4   Лена    19     лыжи      166   Саша    29    180.0
## 5   Даша    29     лыжи      180   Саша    29    180.0
## 6    Ира    26    танцы      170   Дима    26    170.0
## 7   Зина    16    танцы      160   Дима    26    170.0
full_join(x=girls,y=boys,by="hobby")
##   name.x age.x    hobby height.x name.y age.y height.y
## 1   Лена    19     лыжи    166.0   Гена    19    188.0
## 2   Лена    19     лыжи    166.0   Саша    29    180.0
## 3  Жанна    22  вышивка    156.5   <NA>    NA       NA
## 4   Даша    29     лыжи    180.0   Гена    19    188.0
## 5   Даша    29     лыжи    180.0   Саша    29    180.0
## 6    Ира    26    танцы    170.0   Дима    26    170.0
## 7   Зина    16    танцы    160.0   Дима    26    170.0
## 8   <NA>    NA мотоцикл       NA   Женя    32    166.5

Операции Join выдающие данные из первой таблицы

semi_join(x=girls,y=boys,by="hobby")
##   name age hobby height
## 1 Лена  19  лыжи    166
## 2 Даша  29  лыжи    180
## 3  Ира  26 танцы    170
## 4 Зина  16 танцы    160
anti_join(x=girls,y=boys,by="hobby")
##    name age   hobby height
## 1 Жанна  22 вышивка  156.5
semi_join(y=girls,x=boys,by="hobby")
##   name age hobby height
## 1 Гена  19  лыжи    188
## 2 Саша  29  лыжи    180
## 3 Дима  26 танцы    170
anti_join(y=girls,x=boys,by="hobby")
##   name age    hobby height
## 1 Женя  32 мотоцикл  166.5

Задачи из курса БД

  1. Выдайте названия всех регионов, относящихся к Европе, без повторений.
filter(country_t, Continent=="Europe") %>%
  select(Region)  %>%
  distinct()
## Source: local data frame [6 x 1]
## 
##             Region
##              (chr)
## 1  Southern Europe
## 2   Western Europe
## 3   Eastern Europe
## 4 Nordic Countries
## 5 Baltic Countries
## 6  British Islands
  1. Выдайте страны и территории, в которых население (population) составляет 0 жителей. Столбцы:Name, Population, Continent. Упорядочьте по столбцу continent (по возрастанию)
 country_t %>%
  filter(Population==0) %>%
  arrange(Continent) %>%
  select(Name, Population, Continent)
## Source: local data frame [7 x 3]
## 
##                                           Name Population  Continent
##                                          (chr)      (int)      (chr)
## 1               British Indian Ocean Territory          0     Africa
## 2                                   Antarctica          0 Antarctica
## 3                  French Southern territories          0 Antarctica
## 4                                Bouvet Island          0 Antarctica
## 5            Heard Island and McDonald Islands          0 Antarctica
## 6 South Georgia and the South Sandwich Islands          0 Antarctica
## 7         United States Minor Outlying Islands          0    Oceania
  1. Выдайте информацию о странах (столбцы:Name, Population, Continent) за пределами Азии и Океании в которых население (population) насчитывает более 100 млн. человек. Упорядочьте по континенту (по возрастанию)
 country_t %>%
  filter(Population>1e8, 
         !(Continent %in% c("Asia","Oceania"))) %>%
  arrange(Continent) %>%
  select(Name, Population, Continent)
## Source: local data frame [4 x 3]
## 
##                 Name Population     Continent
##                (chr)      (int)         (chr)
## 1            Nigeria  111506000        Africa
## 2 Russian Federation  146934000        Europe
## 3      United States  278357000 North America
## 4             Brazil  170115000 South America
  1. Выдайте страны Европы, в которых плотность населения (Population/SurfaceArea) меньше 10 человек на квадратный километр. Воспользуйтесь полями Population и SurfaceArea (площадь в кв. километрах). Упорядочите по плотности в убывающем порядке
country_t %>%
  filter(Continent=="Europe") %>%
  transmute(Name, SurfaceArea, Population,
            Density=Population/SurfaceArea) %>%
  filter(Density<10) %>%
  arrange(desc(Density))
## Source: local data frame [3 x 4]
## 
##                     Name SurfaceArea Population    Density
##                    (chr)       (dbl)      (int)      (dbl)
## 1     Russian Federation    17075400  146934000 8.60501072
## 2                Iceland      103000     279000 2.70873786
## 3 Svalbard and Jan Mayen       62422       3200 0.05126398
  1. Найдите страны в Европе и Африке, в которых средняя продолжительность жизни не указана в таблице (имеет значение null). Упорядочите поконтиненту
 country_t %>%
  filter(is.na(LifeExpectancy), 
         Continent %in% c("Africa","Europe")) %>%
  arrange(Continent) %>%
  select(Name, Continent)
## Source: local data frame [3 x 2]
## 
##                             Name Continent
##                            (chr)     (chr)
## 1 British Indian Ocean Territory    Africa
## 2         Svalbard and Jan Mayen    Europe
## 3  Holy See (Vatican City State)    Europe
  1. Сколько людей живет в странах, в которых поле форма правления (GovernmentForm) содежит строку «Monarchy» но не содержит строку «Constitutional». Выдайте название, континент, форму правления, численность населения для каждой такой страны. Упорядочите по численности населения (population) по убыванию. Подсказка: функция grep() для сравнения строк с шаблоном
country_t %>%
  filter(!grepl(pattern="Constitutional",country_t$GovernmentForm) & grepl(pattern="Monarchy",country_t$GovernmentForm) ) %>%
   select(Name,Continent,GovernmentForm,Population)
## Source: local data frame [9 x 4]
## 
##           Name Continent        GovernmentForm Population
##          (chr)     (chr)                 (chr)      (int)
## 1      Bahrain      Asia    Monarchy (Emirate)     617000
## 2       Brunei      Asia  Monarchy (Sultanate)     328000
## 3       Bhutan      Asia              Monarchy    2124000
## 4         Oman      Asia  Monarchy (Sultanate)    2542000
## 5        Qatar      Asia              Monarchy     599000
## 6 Saudi Arabia      Asia              Monarchy   21607000
## 7    Swaziland    Africa              Monarchy    1008000
## 8        Tonga   Oceania              Monarchy      99000
## 9        Samoa   Oceania Parlementary Monarchy     180000
  1. Найти страны в Америке, вторая и третья буква названия которых не являются латинской гласной буквой (aeoiuy)
country_t %>%
  filter(grepl(pattern="America$", Continent )&
        grepl(pattern="^.[^aeoiuy]{2}",Name)) %>%
  select(Name,Continent)
## Source: local data frame [4 x 2]
## 
##                  Name     Continent
##                 (chr)         (chr)
## 1            Anguilla North America
## 2           Argentina South America
## 3 Antigua and Barbuda North America
## 4         El Salvador North America