Джерело інформації із сайту Rstudio.

Будуть використовуватись дані diamonds із пакету ggplot2.

library(ggplot2); library(dplyr)
rm(list = ls())

df <- diamonds
head(df)
## Source: local data frame [6 x 10]
## 
##   carat       cut  color clarity depth table price     x     y     z
##   (dbl)    (fctr) (fctr)  (fctr) (dbl) (dbl) (int) (dbl) (dbl) (dbl)
## 1  0.23     Ideal      E     SI2  61.5    55   326  3.95  3.98  2.43
## 2  0.21   Premium      E     SI1  59.8    61   326  3.89  3.84  2.31
## 3  0.23      Good      E     VS1  56.9    65   327  4.05  4.07  2.31
## 4  0.29   Premium      I     VS2  62.4    58   334  4.20  4.23  2.63
## 5  0.31      Good      J     SI2  63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good      J    VVS2  62.8    57   336  3.94  3.96  2.48
glimpse(df)   # "кинути погляд" на дані (аналог функції str()) 
## Observations: 53,940
## Variables: 10
## $ carat   (dbl) 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, ...
## $ cut     (fctr) Ideal, Premium, Good, Premium, Good, Very Good, Very ...
## $ color   (fctr) E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J,...
## $ clarity (fctr) SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, S...
## $ depth   (dbl) 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, ...
## $ table   (dbl) 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54...
## $ price   (int) 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339,...
## $ x       (dbl) 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, ...
## $ y       (dbl) 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, ...
## $ z       (dbl) 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, ...

1. Підмножина спостережень (рядків).

1.1 filter()

filter() - повертає рядки, які задовільняються відповідному критерію.

Відфільтрувати фрейм, при умові, що змінна cut приймає значення Ideal або Premium:

ans <- filter(df, cut == "Ideal" | cut == "Premium")
unique(ans$cut)   # перевірка
## [1] Ideal   Premium
## Levels: Fair < Good < Very Good < Premium < Ideal
# ggplot(df,aes(price,fill=cut))+geom_density(alpha=0.5)

Відфільтрувати фрейм, при умові, що змінна cut приймає значення Ideal або Premium, а змінна price - більше 5000:

ans <- filter(df, cut == "Ideal" | cut == "Premium", price > 5000)
unique(ans$cut)   # перевірка
## [1] Ideal   Premium
## Levels: Fair < Good < Very Good < Premium < Ideal
unique(ans$price > 5000)   # перевірка
## [1] TRUE

1.2 distinct()

distinct() - видаляє дублюючі рядки у фреймі (повертає унікальні значення).

Для наглядності, повернути унікальні значення змінної color:

unique(df$color) 
## [1] E I J H F G D
## Levels: D < E < F < G < H < I < J
distinct(df, color) # якщо є фрейм, то береться перший рядок підмножини
## Source: local data frame [7 x 10]
## 
##   carat       cut  color clarity depth table price     x     y     z
##   (dbl)    (fctr) (fctr)  (fctr) (dbl) (dbl) (int) (dbl) (dbl) (dbl)
## 1  0.23     Ideal      E     SI2  61.5    55   326  3.95  3.98  2.43
## 2  0.29   Premium      I     VS2  62.4    58   334  4.20  4.23  2.63
## 3  0.31      Good      J     SI2  63.3    58   335  4.34  4.35  2.75
## 4  0.26 Very Good      H     SI1  61.9    55   337  4.07  4.11  2.53
## 5  0.22   Premium      F     SI1  60.4    61   342  3.88  3.84  2.33
## 6  0.23 Very Good      G    VVS2  60.4    58   354  3.97  4.01  2.41
## 7  0.23 Very Good      D     VS2  60.5    61   357  3.96  3.97  2.40
df %>% select(color) %>% distinct(color)
## Source: local data frame [7 x 1]
## 
##    color
##   (fctr)
## 1      E
## 2      I
## 3      J
## 4      H
## 5      F
## 6      G
## 7      D

Кількість унікальних значень (застосовується до вектора):

n_distinct(df$color)
## [1] 7

1.3 sample_frac()

sample_frac() - довільно вибрати частину рядків (replace = T - із повтореннями)

Вибрати 60% рядків без повторів:

ans <- sample_frac(df, size = 0.6, replace = F)
nrow(ans)/nrow(df)
## [1] 0.6
round(prop.table(table(df$cut)), 2)
## 
##      Fair      Good Very Good   Premium     Ideal 
##      0.03      0.09      0.22      0.26      0.40
round(prop.table(table(ans$cut)), 2)
## 
##      Fair      Good Very Good   Premium     Ideal 
##      0.03      0.09      0.23      0.26      0.40

1.4 sample_n()

sample_n() - довільно вибрати n рядків.

Вибрати 500 ряків без повторів:

ans <- sample_n(tbl = df, size = 500, replace = F)
nrow(ans)
## [1] 500

1.5 slice()

slice() - вибрати рядки із вказаними позиціями.

Вибрати рядки:

ind <- sample(x = 1:nrow(df), size = 0.3*nrow(df), replace = F)
head(ind)   # вибрали індекси рядків
## [1] 16381  9414 15463 25134  2792 29145
ans <- slice(df, ind)   # вибрали рядки  
nrow(ans)/nrow(df)
## [1] 0.3

1.6 top_n()

top_n() - вибрати топ n записів.

Вибрати топ 5 записів по полю carat:

top_n(x = df, n = 5, wt = carat)
## Source: local data frame [5 x 10]
## 
##   carat     cut  color clarity depth table price     x     y     z
##   (dbl)  (fctr) (fctr)  (fctr) (dbl) (dbl) (int) (dbl) (dbl) (dbl)
## 1  4.01 Premium      I      I1  61.0    61 15223 10.14 10.10  6.17
## 2  4.01 Premium      J      I1  62.5    62 15223 10.02  9.94  6.24
## 3  4.13    Fair      H      I1  64.8    61 17329 10.00  9.85  6.43
## 4  5.01    Fair      J      I1  65.5    59 18018 10.74 10.54  6.98
## 5  4.50    Fair      J      I1  65.8    58 18531 10.23 10.16  6.72

Перевірка:

df[order(-df$carat), ] %>% head(., 5)
## Source: local data frame [5 x 10]
## 
##   carat     cut  color clarity depth table price     x     y     z
##   (dbl)  (fctr) (fctr)  (fctr) (dbl) (dbl) (int) (dbl) (dbl) (dbl)
## 1  5.01    Fair      J      I1  65.5    59 18018 10.74 10.54  6.98
## 2  4.50    Fair      J      I1  65.8    58 18531 10.23 10.16  6.72
## 3  4.13    Fair      H      I1  64.8    61 17329 10.00  9.85  6.43
## 4  4.01 Premium      I      I1  61.0    61 15223 10.14 10.10  6.17
## 5  4.01 Premium      J      I1  62.5    62 15223 10.02  9.94  6.24

2. Підмножина змінних (колонок).

2.1 select()

select() - вибрати відповідні колонки по імені або за допомогою допоміжних функцій.

Вибрати колонки carat, color, price:

ans <- select(df, carat, color, price)
glimpse(ans)
## Observations: 53,940
## Variables: 3
## $ carat (dbl) 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0....
## $ color (fctr) E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J...
## $ price (int) 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 3...
2.1.1 contains()

Використаємо фрейм iris

head(iris, 3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa

Вибрати колонки, які містять текстовий рядок:

ans <- select(iris, contains("."))
head(ans, 3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
2.1.2 ends_with()

Вибрати колонки, які закінчуються на певне текстове значення:

ans <- select(iris, ends_with("Length"))
head(ans, 3)
##   Sepal.Length Petal.Length
## 1          5.1          1.4
## 2          4.9          1.4
## 3          4.7          1.3
2.1.3 everything()

Вибрати всі колонки:

ans <- select(iris, everything())
head(ans, 3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
2.1.4 num_range()

Створимо наступний фрейм:

df.1 <- cbind(rnorm(100), rnorm(100),rnorm(100), rnorm(100),rnorm(100), rnorm(100),rnorm(100), rnorm(100))
colnames(df.1) <- paste("x", 1:ncol(df.1), sep = "")
df.1 <- as.data.frame(df.1)
df.1 %>% glimpse()
## Observations: 100
## Variables: 8
## $ x1 (dbl) -0.15348122, -1.64930622, 0.22918688, 0.83344551, -1.421840...
## $ x2 (dbl) 1.08901393, 2.84465800, -0.79152544, 0.36532931, -0.1845493...
## $ x3 (dbl) 0.92838245, -0.75559791, 0.73795575, 0.66494643, -0.0414391...
## $ x4 (dbl) -1.79603581, 0.19286253, 0.61895873, 0.69806526, -0.8447638...
## $ x5 (dbl) -0.91332541, -0.34975918, -0.25959568, -2.36922849, 0.62304...
## $ x6 (dbl) -0.6583078, -2.4317888, -0.1389960, 1.0973178, -0.4140736, ...
## $ x7 (dbl) 0.19409665, -0.34067849, 0.43226062, -1.54341544, -1.812915...
## $ x8 (dbl) 1.47244465, 2.43506090, -0.65727393, -0.58218684, 0.0711748...

Вибрати колонки х1, х2, х3, х4, х5:

ans <- select(df.1, num_range("x", 1:5))
glimpse(ans)
## Observations: 100
## Variables: 5
## $ x1 (dbl) -0.15348122, -1.64930622, 0.22918688, 0.83344551, -1.421840...
## $ x2 (dbl) 1.08901393, 2.84465800, -0.79152544, 0.36532931, -0.1845493...
## $ x3 (dbl) 0.92838245, -0.75559791, 0.73795575, 0.66494643, -0.0414391...
## $ x4 (dbl) -1.79603581, 0.19286253, 0.61895873, 0.69806526, -0.8447638...
## $ x5 (dbl) -0.91332541, -0.34975918, -0.25959568, -2.36922849, 0.62304...
2.1.5 starts_with()

Вибрати колонки, які починаються із певного текстового значення:

colnames(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
## [5] "Species"
ans <- select(iris, starts_with("Sepal"))
head(ans, 3)
##   Sepal.Length Sepal.Width
## 1          5.1         3.5
## 2          4.9         3.0
## 3          4.7         3.2
2.1.6 “:”

Використаємо фрейм df.1. Вибрати всі колонки між х2 і х6:

colnames(df.1)
## [1] "x1" "x2" "x3" "x4" "x5" "x6" "x7" "x8"
ans <- select(df.1, x2:x6)
head(ans, 3)
##           x2         x3         x4         x5         x6
## 1  1.0890139  0.9283824 -1.7960358 -0.9133254 -0.6583078
## 2  2.8446580 -0.7555979  0.1928625 -0.3497592 -2.4317888
## 3 -0.7915254  0.7379558  0.6189587 -0.2595957 -0.1389960
2.1.7 Виключення колонок

Використаємо фрейм df.1. Вибрати всі колонки окрім х2:

ans <- select(df.1, -x2)
colnames(ans)
## [1] "x1" "x3" "x4" "x5" "x6" "x7" "x8"

Вибрати всі колонки окрім х2 і х6:

ans <- select(df.1, -c(x2, x6))
colnames(ans)
## [1] "x1" "x3" "x4" "x5" "x7" "x8"

3. Підсумкові значення + групування

3.1 summarise() + group_by()

summarise() - узагальнити дані в один рядок (більш читабельна).

Вивести суму та середнє колонки Sepal.Length в даних iris:

summarise(iris, sum.sl = sum(Sepal.Length), mean.sl = mean(Sepal.Length))
##   sum.sl  mean.sl
## 1  876.5 5.843333

Вивести суму та середнє колонки Sepal.Length по змінній Species:

iris %>% 
  group_by(Species) %>% 
  summarise(sum.sl = sum(Sepal.Length), mean.sl = mean(Sepal.Length))
## Source: local data frame [3 x 3]
## 
##      Species sum.sl mean.sl
##       (fctr)  (dbl)   (dbl)
## 1     setosa  250.3   5.006
## 2 versicolor  296.8   5.936
## 3  virginica  329.4   6.588

3.1 summarise_each() + group_by()

summarise_each() - застосувати функцію до кожного стовбця.

Обчислити суму та середнє колонок Sepal.Length і Sepal.Width:

summarise_each(iris, funs(mean, sum), Sepal.Length, Sepal.Width)
##   Sepal.Length_mean Sepal.Width_mean Sepal.Length_sum Sepal.Width_sum
## 1          5.843333         3.057333            876.5           458.6

Обчислити суму та середнє колонок Sepal.Length і Sepal.Width по змінній Species:

iris %>% 
  group_by(Species) %>%
  summarise_each(funs(mean, sum), Sepal.Length, Sepal.Width) %>% 
  setNames(c("group", "mean.sl", "mean.sw", "sum.sl", "sum.sw"))
## Source: local data frame [3 x 5]
## 
##        group mean.sl mean.sw sum.sl sum.sw
##       (fctr)   (dbl)   (dbl)  (dbl)  (dbl)
## 1     setosa   5.006   3.428  250.3  171.4
## 2 versicolor   5.936   2.770  296.8  138.5
## 3  virginica   6.588   2.974  329.4  148.7

4. Створення нових змінних.

4.1 mutate()

mutate() - розрахунок і створення нових змінних.

В даних iris створити нову зміну sepal як суму Sepal.Length і Sepal.Width:

ans <- mutate(iris, sepal = Sepal.Length + Sepal.Width)
glimpse(ans)
## Observations: 150
## Variables: 6
## $ Sepal.Length (dbl) 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9,...
## $ Sepal.Width  (dbl) 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1,...
## $ Petal.Length (dbl) 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5,...
## $ Petal.Width  (dbl) 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1,...
## $ Species      (fctr) setosa, setosa, setosa, setosa, setosa, setosa, ...
## $ sepal        (dbl) 8.6, 7.9, 7.9, 7.7, 8.6, 9.3, 8.0, 8.4, 7.3, 8.0,...
4.1.1 lag() - значення n кроків “назад” (лаг)

Вивести 1-й лаг змінної Sepal.Length:

ans <- iris %>% mutate(Sepal.Length.lag.1 = lag(Sepal.Length, 1))
glimpse(ans)
## Observations: 150
## Variables: 6
## $ Sepal.Length       (dbl) 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4...
## $ Sepal.Width        (dbl) 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9...
## $ Petal.Length       (dbl) 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4...
## $ Petal.Width        (dbl) 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2...
## $ Species            (fctr) setosa, setosa, setosa, setosa, setosa, se...
## $ Sepal.Length.lag.1 (dbl) NA, 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0,...

Вивести 1-й лаг змінної Sepal.Length по змінній Species (віконна функція):

# виберемо випадково 10% даних
set.seed(1)
ans_frac <- sample_frac(iris, size = 0.1, replace = F) %>% 
  arrange(Species)

ans <- ans_frac %>% 
  select(Species, Sepal.Length) %>% 
  group_by(Species) %>% 
  mutate(Sepal.Length.lag.1 = lag(Sepal.Length, 1))
ans
## Source: local data frame [15 x 3]
## Groups: Species [3]
## 
##       Species Sepal.Length Sepal.Length.lag.1
##        (fctr)        (dbl)              (dbl)
## 1      setosa          5.1                 NA
## 2      setosa          4.7                5.1
## 3      setosa          4.4                4.7
## 4      setosa          5.2                4.4
## 5      setosa          4.8                5.2
## 6  versicolor          5.7                 NA
## 7  versicolor          5.4                5.7
## 8  versicolor          5.6                5.4
## 9  versicolor          5.5                5.6
## 10 versicolor          6.9                5.5
## 11  virginica          6.3                 NA
## 12  virginica          7.4                6.3
## 13  virginica          6.3                7.4
## 14  virginica          5.8                6.3
## 15  virginica          6.5                5.8
4.1.2 lead() - значення n кроків “вперед”

Вивести 1-е значення “впереді”" змінної Sepal.Length:

ans <- ans_frac %>% mutate(Sepal.Length.lead.1 = lead(Sepal.Length, 1))
ans
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1           5.1         3.4          1.5         0.2     setosa
## 2           4.7         3.2          1.6         0.2     setosa
## 3           4.4         2.9          1.4         0.2     setosa
## 4           5.2         3.4          1.4         0.2     setosa
## 5           4.8         3.4          1.9         0.2     setosa
## 6           5.7         2.8          4.5         1.3 versicolor
## 7           5.4         3.0          4.5         1.5 versicolor
## 8           5.6         2.7          4.2         1.3 versicolor
## 9           5.5         2.5          4.0         1.3 versicolor
## 10          6.9         3.1          4.9         1.5 versicolor
## 11          6.3         2.8          5.1         1.5  virginica
## 12          7.4         2.8          6.1         1.9  virginica
## 13          6.3         3.4          5.6         2.4  virginica
## 14          5.8         2.7          5.1         1.9  virginica
## 15          6.5         3.0          5.8         2.2  virginica
##    Sepal.Length.lead.1
## 1                  4.7
## 2                  4.4
## 3                  5.2
## 4                  4.8
## 5                  5.7
## 6                  5.4
## 7                  5.6
## 8                  5.5
## 9                  6.9
## 10                 6.3
## 11                 7.4
## 12                 6.3
## 13                 5.8
## 14                 6.5
## 15                  NA

Вивести 1-е значення “впереді”" змінної Sepal.Length по змінній Species (віконна функція):

ans <- ans_frac %>% 
  select(Species, Sepal.Length) %>% 
  group_by(Species) %>% 
  mutate(Sepal.Length.lead.1 = lead(Sepal.Length, 1))
ans
## Source: local data frame [15 x 3]
## Groups: Species [3]
## 
##       Species Sepal.Length Sepal.Length.lead.1
##        (fctr)        (dbl)               (dbl)
## 1      setosa          5.1                 4.7
## 2      setosa          4.7                 4.4
## 3      setosa          4.4                 5.2
## 4      setosa          5.2                 4.8
## 5      setosa          4.8                  NA
## 6  versicolor          5.7                 5.4
## 7  versicolor          5.4                 5.6
## 8  versicolor          5.6                 5.5
## 9  versicolor          5.5                 6.9
## 10 versicolor          6.9                  NA
## 11  virginica          6.3                 7.4
## 12  virginica          7.4                 6.3
## 13  virginica          6.3                 5.8
## 14  virginica          5.8                 6.5
## 15  virginica          6.5                  NA
4.1.3 rank (ранги)

dense_rank() - ранг без пропуска.

min_rank() - ранг з пропусками.

percent_rank() - ранг в діапазоні [0, 1].

ans_frac %>% 
  select(Sepal.Length) %>% 
  arrange(Sepal.Length) %>% 
  mutate(min.rank = min_rank(Sepal.Length),
         dense.rank = dense_rank(Sepal.Length),
         percent_rank = percent_rank(Sepal.Length),
         row.number = row_number(Sepal.Length))
##    Sepal.Length min.rank dense.rank percent_rank row.number
## 1           4.4        1          1   0.00000000          1
## 2           4.7        2          2   0.07142857          2
## 3           4.8        3          3   0.14285714          3
## 4           5.1        4          4   0.21428571          4
## 5           5.2        5          5   0.28571429          5
## 6           5.4        6          6   0.35714286          6
## 7           5.5        7          7   0.42857143          7
## 8           5.6        8          8   0.50000000          8
## 9           5.7        9          9   0.57142857          9
## 10          5.8       10         10   0.64285714         10
## 11          6.3       11         11   0.71428571         11
## 12          6.3       11         11   0.71428571         12
## 13          6.5       13         12   0.85714286         13
## 14          6.9       14         13   0.92857143         14
## 15          7.4       15         14   1.00000000         15
4.1.4 cum… (кумулятивні функції)

cumsum() - кумулятивна сума. cummim() - кумулятивний мінімум. cummax() - кумулятивний максимум. cumall() - кумулятивна функція all().

ans_frac %>% 
  select(Species, Sepal.Length) %>% 
  mutate(help.value = c(T,T,T,T,T,F,F,F,F,F,T,T,T,T,T)) %>% 
  group_by(Species) %>% 
  mutate(cum.sum  = cumsum(Sepal.Length),
         cum.min  = cummin(Sepal.Length),
         cum.max  = cummax(Sepal.Length),
         cum.all = cumall(help.value),
         cum.any = cumany(help.value))
## Source: local data frame [15 x 8]
## Groups: Species [3]
## 
##       Species Sepal.Length help.value cum.sum cum.min cum.max cum.all
##        (fctr)        (dbl)      (lgl)   (dbl)   (dbl)   (dbl)   (lgl)
## 1      setosa          5.1       TRUE     5.1     5.1     5.1    TRUE
## 2      setosa          4.7       TRUE     9.8     4.7     5.1    TRUE
## 3      setosa          4.4       TRUE    14.2     4.4     5.1    TRUE
## 4      setosa          5.2       TRUE    19.4     4.4     5.2    TRUE
## 5      setosa          4.8       TRUE    24.2     4.4     5.2    TRUE
## 6  versicolor          5.7      FALSE     5.7     5.7     5.7   FALSE
## 7  versicolor          5.4      FALSE    11.1     5.4     5.7   FALSE
## 8  versicolor          5.6      FALSE    16.7     5.4     5.7   FALSE
## 9  versicolor          5.5      FALSE    22.2     5.4     5.7   FALSE
## 10 versicolor          6.9      FALSE    29.1     5.4     6.9   FALSE
## 11  virginica          6.3       TRUE     6.3     6.3     6.3    TRUE
## 12  virginica          7.4       TRUE    13.7     6.3     7.4    TRUE
## 13  virginica          6.3       TRUE    20.0     6.3     7.4    TRUE
## 14  virginica          5.8       TRUE    25.8     5.8     7.4    TRUE
## 15  virginica          6.5       TRUE    32.3     5.8     7.4    TRUE
## Variables not shown: cum.any (lgl)

5. Інші функції

Використаємо набір даних mtcars.

df.cars <- mtcars

add_rownames() - конвертувати назви рядків (rownames()) в нову змінну.

Створимо нову змінну, в якій будуть міститись назви рядків:

df.cars <- add_rownames(df.cars, var = "name.of.cars")
head(df.cars, 3)
## Source: local data frame [3 x 12]
## 
##    name.of.cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am
##           (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1     Mazda RX4  21.0     6   160   110  3.90 2.620 16.46     0     1
## 2 Mazda RX4 Wag  21.0     6   160   110  3.90 2.875 17.02     0     1
## 3    Datsun 710  22.8     4   108    93  3.85 2.320 18.61     1     1
## Variables not shown: gear (dbl), carb (dbl)

arrange() - сортування (+desc()).

df.cars %>% arrange(disp)
## Source: local data frame [32 x 12]
## 
##      name.of.cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am
##             (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1  Toyota Corolla  33.9     4  71.1    65  4.22 1.835 19.90     1     1
## 2     Honda Civic  30.4     4  75.7    52  4.93 1.615 18.52     1     1
## 3        Fiat 128  32.4     4  78.7    66  4.08 2.200 19.47     1     1
## 4       Fiat X1-9  27.3     4  79.0    66  4.08 1.935 18.90     1     1
## 5    Lotus Europa  30.4     4  95.1   113  3.77 1.513 16.90     1     1
## 6      Datsun 710  22.8     4 108.0    93  3.85 2.320 18.61     1     1
## 7   Toyota Corona  21.5     4 120.1    97  3.70 2.465 20.01     1     0
## 8   Porsche 914-2  26.0     4 120.3    91  4.43 2.140 16.70     0     1
## 9      Volvo 142E  21.4     4 121.0   109  4.11 2.780 18.60     1     1
## 10       Merc 230  22.8     4 140.8    95  3.92 3.150 22.90     1     0
## ..            ...   ...   ...   ...   ...   ...   ...   ...   ...   ...
## Variables not shown: gear (dbl), carb (dbl)
df.cars %>% arrange(desc(disp))
## Source: local data frame [32 x 12]
## 
##           name.of.cars   mpg   cyl  disp    hp  drat    wt  qsec    vs
##                  (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1   Cadillac Fleetwood  10.4     8   472   205  2.93 5.250 17.98     0
## 2  Lincoln Continental  10.4     8   460   215  3.00 5.424 17.82     0
## 3    Chrysler Imperial  14.7     8   440   230  3.23 5.345 17.42     0
## 4     Pontiac Firebird  19.2     8   400   175  3.08 3.845 17.05     0
## 5    Hornet Sportabout  18.7     8   360   175  3.15 3.440 17.02     0
## 6           Duster 360  14.3     8   360   245  3.21 3.570 15.84     0
## 7       Ford Pantera L  15.8     8   351   264  4.22 3.170 14.50     0
## 8           Camaro Z28  13.3     8   350   245  3.73 3.840 15.41     0
## 9     Dodge Challenger  15.5     8   318   150  2.76 3.520 16.87     0
## 10         AMC Javelin  15.2     8   304   150  3.15 3.435 17.30     0
## ..                 ...   ...   ...   ...   ...   ...   ...   ...   ...
## Variables not shown: am (dbl), gear (dbl), carb (dbl)

between() - чи попадає числовий вектор в заданий діапазон.

df.cars$disp %>% between(100, 200)
##  [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
## [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [23] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE
df.cars[between(df.cars$disp, 100, 200), ]
## Source: local data frame [11 x 12]
## 
##     name.of.cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am
##            (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1      Mazda RX4  21.0     6 160.0   110  3.90 2.620 16.46     0     1
## 2  Mazda RX4 Wag  21.0     6 160.0   110  3.90 2.875 17.02     0     1
## 3     Datsun 710  22.8     4 108.0    93  3.85 2.320 18.61     1     1
## 4      Merc 240D  24.4     4 146.7    62  3.69 3.190 20.00     1     0
## 5       Merc 230  22.8     4 140.8    95  3.92 3.150 22.90     1     0
## 6       Merc 280  19.2     6 167.6   123  3.92 3.440 18.30     1     0
## 7      Merc 280C  17.8     6 167.6   123  3.92 3.440 18.90     1     0
## 8  Toyota Corona  21.5     4 120.1    97  3.70 2.465 20.01     1     0
## 9  Porsche 914-2  26.0     4 120.3    91  4.43 2.140 16.70     0     1
## 10  Ferrari Dino  19.7     6 145.0   175  3.62 2.770 15.50     0     1
## 11    Volvo 142E  21.4     4 121.0   109  4.11 2.780 18.60     1     1
## Variables not shown: gear (dbl), carb (dbl)

bind_rows() - об“єднати по рядках.

bind_cols() - об“єднати по колонках.

y <- data.frame(x1 = c("A", "B", "C"), x2 = c(1, 2, 3), stringsAsFactors = F)
z <- data.frame(x1 = c("B", "C", "D"), x2 = c(2, 3, 4), stringsAsFactors = F)
bind_rows(y, z)
## Source: local data frame [6 x 2]
## 
##      x1    x2
##   (chr) (dbl)
## 1     A     1
## 2     B     2
## 3     C     3
## 4     B     2
## 5     C     3
## 6     D     4
bind_cols(y, z)
## Source: local data frame [3 x 4]
## 
##      x1    x2    x1    x2
##   (chr) (dbl) (chr) (dbl)
## 1     A     1     B     2
## 2     B     2     C     3
## 3     C     3     D     4

5. JOIN (аналог merge())

5.1 inner join
y <- data.frame(x1 = c("A", "B", "C"), x2 = c(1, 2, 3), stringsAsFactors = F)
z <- data.frame(x1 = c("B", "C", "D"), x3 = c(2, 3, 4), stringsAsFactors = F)
y; z
##   x1 x2
## 1  A  1
## 2  B  2
## 3  C  3
##   x1 x3
## 1  B  2
## 2  C  3
## 3  D  4
inner_join(x = y, y = z, by = "x1")
##   x1 x2 x3
## 1  B  2  2
## 2  C  3  3
5.2 left join
left_join(x = y, y = z, by = "x1")
##   x1 x2 x3
## 1  A  1 NA
## 2  B  2  2
## 3  C  3  3
5.3 right join
right_join(x = y, y = z, by = "x1")
##   x1 x2 x3
## 1  B  2  2
## 2  C  3  3
## 3  D NA  4
5.4 full join
full_join(x = y, y = z, by = "x1")
##   x1 x2 x3
## 1  A  1 NA
## 2  B  2  2
## 3  C  3  3
## 4  D NA  4