R Select(), Filter(), Arrange(), Pipeline with Example

Бібліотека під назвою dplyr містить цінні дієслова для навігації всередині набору даних. У цьому підручнику ви будете використовувати набір даних про час подорожі. Набір даних збирає інформацію про поїздку водія між домом і роботою. У наборі даних є чотирнадцять змінних, зокрема:

  • DayOfWeek: визначте день тижня, коли водій використовує свій автомобіль
  • Відстань: загальна відстань шляху
  • MaxSpeed: максимальна швидкість подорожі
  • Загальний час: тривалість шляху в хвилинах

Набір даних містить близько 200 спостережень, між якими відбувалися поїздки Monday до п'ятниці.

Перш за все, вам необхідно:

  • завантажити набір даних
  • перевірити структуру даних.

Однією зручною функцією dplyr є функція glimpse(). Це покращення порівняно з str(). Ми можемо використовувати glimpse(), щоб побачити структуру набору даних і вирішити, які маніпуляції потрібні.

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

вихід:

## Observations: 205
## Variables: 14
## $ X              <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
## $ Date           <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20...
## $ StartTime      <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3...
## $ DayOfWeek      <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,...
## $ GoingTo        <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS...
## $ Distance       <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37...
## $ MaxSpeed       <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2...
## $ AvgSpeed       <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,...
## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,...
## $ FuelEconomy    <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89...
## $ TotalTime      <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,...
## $ MovingTime     <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,...
## $ Take407All     <fctr> No, No, No, No, No, No, No, No, No, No, No, No...
## $ Comments       <fctr> , , , , , , , , , , , , , , , Put snow tires o...	

Це очевидно, що змінна Коментарі потребує додаткової діагностики. Перші спостереження змінної Comments містять лише відсутні значення.

sum(df$Comments =="")

Пояснення коду

  • sum(df$Comments ==””): підсумуйте спостереження, які дорівнюють “” у стовпці коментарів від df

вихід:

## [1] 181

вибрати ()

Ми почнемо з дієслова select(). Нам не обов’язково потрібні всі змінні, і добре вибирати лише ті змінні, які ви вважаєте релевантними.

У нас відсутні 181 спостереження, майже 90 відсотків набору даних. Якщо ви вирішите їх виключити, ви не зможете продовжити аналіз.

Інша можливість — відкинути змінну Comment за допомогою дієслова select().

Ми можемо вибирати змінні різними способами за допомогою select(). Зауважте, що першим аргументом є набір даних.

- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset.
- `select(df, A:C)`: Select all variables from A to C from df dataset.
- `select(df, -C)`: Exclude C from the dataset from df dataset.	

Ви можете скористатися третім способом виключення змінної Comments.

step_1_df <- select(df, -Comments)
dim(df)

вихід:

## [1] 205  14
dim(step_1_df)

вихід:

## [1] 205  13

Оригінальний набір даних містить 14 функцій, а step_1_df — 13.

Фільтр()

Дієслово filter() допомагає зберегти спостереження за критерієм. Filter() працює так само, як select(), спочатку ви передаєте кадр даних, а потім умову, розділену комою:

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

Один критерій

Перш за все, ви можете підрахувати кількість спостережень на кожному рівні факторної змінної.

table(step_1_df$GoingTo)

Пояснення коду

  • table(): підрахувати кількість спостережень за рівнем. Зверніть увагу, що приймається лише змінна рівня фактора
  • table(step_1_df$GoingTo): Підрахуйте кількість поїздок до кінцевого пункту призначення.

вихід:

## 
##  GSK Home 
##  105  100	

Функціональна таблиця() вказує, що 105 поїздок йдуть до GSK і 100 до Дому.

Ми можемо відфільтрувати дані, щоб повернути один набір даних із 105 спостереженнями та інший із 100 спостереженнями.

# Select observations
if GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

вихід:

## [1] 100  14
# Select observations
if GoingTo == Work
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

вихід:

## [1] 105  14

Кілька критеріїв

Ми можемо фільтрувати набір даних за кількома критеріями. Наприклад, ви можете отримати спостереження, де пунктом призначення є Дім і відбулося в середу.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

вихід:

## [1] 23 14

23 спостереження відповідали цьому критерію.

Трубопровід

Створення набору даних вимагає багатьох операцій, таких як:

  • імпорт
  • злиття
  • вибирає
  • фільтрація
  • і так далі

Бібліотека dplyr постачається з практичним оператором %>%, який називається the трубопровід. Функція конвеєра робить маніпуляції чистими, швидкими та менш схильними до помилок.

Цей оператор є кодом, який виконує кроки без збереження проміжних кроків на жорсткому диску. Якщо ви повернетесь до нашого прикладу вище, ви можете вибрати цікаві змінні та відфільтрувати їх. У нас є три кроки:

  • Крок 1. Імпортуйте дані: імпортуйте дані GPS
  • Крок 2: Виберіть дані: виберіть GoingTo та DayOfWeek
  • Крок 3: Фільтруйте дані: повертайтеся лише додому та в середу

Ми можемо використати важкий спосіб зробити це:

# Step 1
step_1 <- read.csv(PATH)

# Step 2 
step_2 <- select(step_1, GoingTo, DayOfWeek)

# Step 3 
step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday")

head(step_3)

вихід:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

Це незручний спосіб виконання багатьох операцій, особливо в ситуації з великою кількістю кроків. Середовище закінчується багатьма збереженими об’єктами.

Давайте замість цього використаємо оператор конвеєра %>%. Нам потрібно лише визначити фрейм даних, який використовується на початку, і весь процес випливатиме з нього.

Основний синтаксис конвеєра

New_df <- df %>%
step 1 %>%
step 2 %>%
...
arguments
- New_df: Name of the new data frame 
- df: Data frame used to compute the step
- step: Instruction for each step
- Note: The last instruction does not need the pipe operator `%`, you don't have instructions to pipe anymore
Note: Create a new variable is optional. If not included, the output will be displayed in the console.

Ви можете створити свою першу трубу, дотримуючись кроків, перерахованих вище.

# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline
filter_home_wed <- 

#Step 1
read.csv(PATH) % > % 

#Step 2
select(GoingTo, DayOfWeek) % > % 

#Step 3
filter(GoingTo == "Home",DayOfWeek == "Wednesday")
identical(step_3, filter_home_wed)

вихід:

## [1] TRUE

Ми готові створити приголомшливий набір даних разом з оператором трубопроводу.

упорядкувати()

Перейдіть на вкладку попередній навчальний посібник, ви дізнаєтесь, як сортувати значення за допомогою функції sort(). Бібліотека dplyr має функцію сортування. Це чудово працює з конвеєром. Дієслово arrange() може змінити порядок одного або багатьох рядків, або за зростанням (за замовчуванням), або за спаданням.

- `arrange(A)`: Ascending sort of variable A
- `arrange(A, B)`: Ascending sort of variable A and B
- `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B

Ми можемо сортувати відстань за пунктом призначення.

# Sort by destination and distance
step_2_df <-step_1_df %>%
	arrange(GoingTo, Distance)
head<step_2_df)

вихід:

##     X       Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed
## 1 193  7/25/2011     08:06    Monday     GSK    48.32    121.2     63.4
## 2 196  7/21/2011     07:59  Thursday     GSK    48.35    129.3     81.5
## 3 198  7/20/2011     08:24 Wednesday     GSK    48.50    125.8     75.7
## 4 189  7/27/2011     08:15 Wednesday     GSK    48.82    124.5     70.4
## 5  95 10/11/2011     08:25   Tuesday     GSK    48.94    130.8     85.7
## 6 171  8/10/2011     08:13 Wednesday     GSK    48.98    124.8     72.8
##   AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All
## 1           78.4        8.45      45.7       37.0         No
## 2           89.0        8.28      35.6       32.6        Yes
## 3           87.3        7.89      38.5       33.3        Yes
## 4           77.8        8.45      41.6       37.6         No
## 5           93.2        7.81      34.3       31.5        Yes
## 6           78.8        8.54      40.4       37.3         No

Підсумки

У таблиці нижче ви узагальнюєте всі операції, які ви вивчили під час навчання.

дієслово Мета код Пояснення
оглядати перевірте структуру df
glimpse(df)
Ідентичний str()
вибрати () Виберіть/виключіть змінні
select(df, A, B ,C)
Виберіть змінні A, B і C
select(df, A:C)
Виберіть усі змінні від A до C
select(df, -C)
Виключити C
filter () Фільтруйте df на основі однієї або кількох умов
filter(df, condition1)
Одна умова
filter(df, condition1
умова2)
упорядкувати() Сортуйте набір даних за однією або багатьма змінними
arrange(A)
Сортування змінної А за зростанням
arrange(A, B)
Сортування за зростанням змінних A і B
arrange(desc(A), B)
Сортування за спаданням змінної A та сортування за зростанням B
%>% Створіть конвеєр між кожним кроком
step 1 %>% step 2 %>% step 3