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 |