R Select(), Filter(), Align(), 파이프라인(예제 포함)

dplyr이라는 라이브러리에는 데이터 세트 내부를 탐색하는 데 유용한 동사가 포함되어 있습니다. 이 튜토리얼에서는 이동 시간 데이터세트를 사용합니다. 데이터세트는 운전자가 집과 직장을 오가는 이동 경로에 대한 정보를 수집합니다. 데이터 세트에는 다음을 포함하여 XNUMX개의 변수가 있습니다.

  • DayOfWeek: 운전자가 자동차를 사용하는 요일을 식별합니다.
  • 거리: 여행의 총 거리
  • MaxSpeed: 여행의 최대 속도
  • TotalTime: 이동 시간(분)

데이터세트에는 약 200개의 관측값이 있으며, 탑승은 사이에 발생했습니다. Monday 금요일에.

우선, 다음을 수행해야 합니다.

  • 데이터세트 로드
  • 데이터의 구조를 확인하세요.

dplyr의 편리한 기능 중 하나는 looking() 기능입니다. 이는 str()에 비해 개선된 것입니다. laplign()을 사용하여 데이터세트의 구조를 확인하고 어떤 조작이 필요한지 결정할 수 있습니다.

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 변수에 추가 진단이 필요하다는 것이 분명합니다. Comments 변수의 첫 번째 관측치는 누락된 값일 뿐입니다.

sum(df$Comments =="")

코드 설명

  • sum(df$Comments ==""): df의 열 주석에서 ""와 동일한 관측치를 합산합니다.

출력:

## [1] 181

고르다()

select() 동사부터 시작하겠습니다. 모든 변수가 반드시 필요한 것은 아니며 관련성이 있다고 생각되는 변수만 선택하는 것이 좋습니다.

데이터 세트의 거의 181%에 해당하는 90개의 누락된 관측치가 있습니다. 제외하기로 결정하면 분석을 계속할 수 없습니다.

다른 가능성은 select() 동사를 사용하여 Comment 변수를 삭제하는 것입니다.

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 라이브러리에는 %>%라는 실용적인 연산자가 함께 제공됩니다. 관로. 파이프라인 기능을 사용하면 조작이 깔끔하고 빠르며 오류 발생 가능성이 줄어듭니다.

이 연산자는 중간 단계를 하드 드라이브에 저장하지 않고 단계를 수행하는 코드입니다. 위의 예로 돌아가면 관심 있는 변수를 선택하여 필터링할 수 있습니다. 세 가지 단계가 있습니다.

  • 1단계: 데이터 가져오기: GPS 데이터 가져오기
  • 2단계: 데이터 선택: GoingTo 및 DayOfWeek 선택
  • 3단계: 데이터 필터링: Home과 Wednesday만 반환

우리는 그것을 하기 위해 어려운 방법을 사용할 수 있습니다:

# 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(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 제외
필터() 하나 이상의 조건을 기반으로 df 필터링
filter(df, condition1)
하나의 조건
filter(df, condition1
조건2)
마련하다() 하나 이상의 변수를 사용하여 데이터 세트 정렬
arrange(A)
변수 A의 오름차순 정렬
arrange(A, B)
변수 A와 B의 오름차순 정렬
arrange(desc(A), B)
변수 A의 내림차순 정렬과 B의 오름차순 정렬
%>% 각 단계 사이에 파이프라인 생성
step 1 %>% step 2 %>% step 3