R(tidyverse) dplyr 3

Tae Yoon·2024년 4월 16일
0

int: 정수
dbl: 더블형 또는 실수
chr: 문자열 벡터 또는 문자열
dttm: 데이트-타임형(날짜+시간)
lgl: TRUE나 FALSE만 포함하는 벡터인 논리형
fctr: 팩터형. 가능한 값이 미리 정해진 범주형 변수로 사용
date: 데이트형


dplyr 기초

  • 값을 기준을로 선택하라: filter()
  • 행을 재정렬: arrange()
  • 이름으로 변수를 선택: select()
  • 기존 변수들의 함수로 새로운 변수 생성: mutate()
  • 많은 값을 하나의 요약값으로: summarize()

    이것들은 모두 group_by()와 함께 사용가능
    group_by(): 전체 데이터셋에 동작하지 않고 그룹마다 동작하도록 함수의 범위 변경

  1. 첫 인수는 데이터프레임입니다.
  2. 그 이후의 인수들은 (따옴표가 없는) 변수 이름을 사용하여 데이터프레임에 무엇을 할지를 설명합니다.
  3. 결과는 새로운 데이터프레임입니다.

filter()로 행 필터링

filter(flights, month == 1, day == 1)

dplyr 함수들은 입력을 절대 수정하지 않기 때문에, 즉, 기존의 flights 데이터셋을 바꾸지 않는다. 결과를 저장하려면 할당 연산자 <-를 사용해야 한다

%in%: 포함연산자

11월이나 12월에 출발한 항공편
nov_dec <- filter(flights, month %in% c(11, 12))

결측값(NA)

NA는 모르는 값을 나타내므로, 모르는 값이 연관된 연산의 결과도 대부분 모르는 값이 된다


값이 결측인지를 확인하고 싶으면 is.na()를 사용
x <- NA
is.na(x)

파이프 연산자(%>%)

dplyr 패키지의 파이프 연산자는 "그 다음"의 의미를 가지는 연산자, 코드를 읽기 쉽게 만든다
단축키: Ctrl+Shift+m

flights %>% 
  filter(month %in% c(11,12))

arrange()로 행 정렬하기

arrange()는 행을 선택하는 대신, 순서를 바꾼다는 것만 제외하고는 filter()와 유사. 데이터프레임과 정렬기준으로 지정할 열 이름 집합을 입력으로 하고, 디폴트는 오름차순 정렬

flights %>% 
  arrange(year, day, month)

내림차순으로 재정렬하려면 desc()를 사용

flights %>% 
  arrange(desc(dep_delay))

결측값은 항상 마지막에 정렬된다


select()로 열 선택하기

select() 관심 있는 열들을 선택한다

select() 안에서 사용할 수 있는 도우미 함수들
starts_with(“abc”) ’abc로 시작하는 이름에 매칭
ends_with(“xyz”) ’xyz’로 끝나는 이름에 매칭
contains(“ijk”) ’ijk’를 포함하는 이름에 매칭
matches(“(.)\1”) 정규표현식에 매칭되는 변수들을 선택. 이 표현식은 반복되는 문자를 포함하는 변수에 매칭됩니다.
num_range(“x”, 1:3) x1, x2, x3에 매칭

flights %>% 
  select(year:day, ends_with("delay"), distance,
         air_time) %>% # end_with(): 로 끝나는 문자열 찾기
# year, month, day열 선택
flights %>% 
  select(year, month, day)

# year, month, day열 선택 위에 코드와 같음
flights %>% 
  select(year:day)

# year, month, day열 "빼고" 선택
flights %>% 
  select(-(year:day))

# 문자인 모든 열 선택
flights %>% 
  select(where(is.character))

everything()

everything()은 몇 개의 변수를 데이터프레임의 시작 부분으로 옮겨준다

flights %>% 
  select(time_hour, air_time, everything())

relocate()

relocate() 함수는 변수를 원하는 위치로 이동시킬 수 있다 기본값은 맨 앞으로 이동
.before 인수와 .after 인수를 사용해 변수를 위치시킬 곳을 정할 수 있다.

flights %>% 
  relocate(year:dep_time, .after = time_hour)

rename() 변수 이름 변경

rename() 함수는 데이터프레임이 가진 변수의 이름을 비꿀 때 사용
rename(데이터프레임명, 새로운 변수명 = 기존 변수명)

flights %>% 
  rename(tail_num=tailnum)

mutate()로 새로운 변수 추가

mutate()함수는 새로운 열을 추가한다
mutate()는 새로운 열을 항상 데이터셋 마지막에 추가한다

flights %>% 
  select(year:day, ends_with("delay"), distance,
         air_time) %>% # end_with(): 로 끝나는 문자열 찾기
  mutate(
    gain=dep_delay - arr_delay, # gain, speed, hours, gain_per_hour: 새로운 변수
    speed=distance/air_time*60,
    hours=air_time/60,
    gain_per_hour=gain/hours,
    .before=1
  )

# 새로 만든 변수들의 위치도 조정 가능
flights %>% 
  select(year:day, ends_with("delay"), distance,
         air_time) %>% # end_with(): 로 끝나는 문자열 찾기
  mutate(
    gain=dep_delay - arr_delay, # gain: 새로운 변수
    speed=distance/air_time*60,
    hours=air_time/60,
    gain_per_hour=gain/hours,
    .after=day # day 뒤에 mutate 변수들 순서오게
  )
  
flights %>% 
  select(year:day, ends_with("delay"), distance,
         air_time) %>% # end_with(): 로 끝나는 문자열 찾기
  mutate(
    gain=dep_delay - arr_delay, # gain: 새로운 변수
    speed=distance/air_time*60,
    hours=air_time/60,
    gain_per_hour=gain/hours,
    .keep='used' # 계산의 입력된 변수와 출력물 표시
  )

transmute(): 새롭게 추가된 변수만 남기려면

flights %>% 
  transmute(
    gain=dep_delay-arr_delay,
    hours=air_time/60,
    gain_per_hour=gain/hours
  )

모듈러 연산 %/%, %%

%/%: 정수나누기

%%: 나머지

transmute(flights,
  dep_time,
  hour = dep_time %/% 100,
  minute = dep_time %% 100
)

오프셋

lead()와 lag()를 사용하면 벡터를 앞으로 당기거나(lead), 뒤로 미는 것(lag)을 참조할 수 있다

(x <- 1:10)
##  [1]  1  2  3  4  5  6  7  8  9 10

lag(x)
##  [1] NA  1  2  3  4  5  6  7  8  9

lead(x)
##  [1]  2  3  4  5  6  7  8  9 10 NA

누적 및 롤링 집계

연속하는 합계 cumsum(),
연속하는 곱셈 cumprod(),
연속하는 최솟값 cummin(),
연속하는 최댓값 cummax().
dplyr에는 누적평균을 구하는 cummean()이 있음.

cummean(x)
##  [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5

랭킹

min_rank()는 가장 평범한 유형의 랭킹을 수행합니다.(예: 첫 번째, 두 번재, 세 번째).

y <- c(1, 2, 2, NA, 3, 4)
# 기본값에서 가장 작은 값이 가장 낮은 순서가 됩니다.
min_rank(y)
## [1]  1  2  2 NA  4  5
# 가장 큰 값을 가장 낮은 순서로 만들고 싶다면 desc()를 사용합니다.
min_rank(desc(y))
## [1]  5  3  3 NA  2  1

row_number(), min_rank(), dense_rank(): 순위에 대한 index를 반환

row_number() : 동일한 값이라도 고유한 순위를 부여, 동일값에 대해서는 ‘1 2 3 NA 4 5’ 처리
min_rank() : 기본값에서 가장 작은 값이 가장 낮은 순위를 부여, 동일값에 대해서는 ‘1 2 2 NA 4 5’ 처리
dense_rank(): 동일한 순위를 하나의 건수로 취급, 동일값에 대해서는 ‘1 2 2 NA 3 4’ 처리
cume_dist(), percent_rank() : 순위에 대한 0~1 사이의 index를 반환

cume_dist(): 현재 값보다 작거나 동일한 값의 순위(ranking) 상의 비율 (0~1), ‘0.2 0.6 0.6 NA 0.8 1.0’ 처리
percent_rank() : min_rank() 기준의 순위(ranking)에 대한 비율(0~1), ‘0.00 0.25 0.25 NA 0.75’ 처리
ntile() : n개의 동일한 개수로 sub 데이터셋을 나누어줍니다.

summarize()로 그룹화 요약하기

summarise()는 데이터프레임을 하나의 행으로 요약한다
group_by()는 분석의 단위를 전체 데이터셋에서 개별 그룹으로 변경
count() 는 다음의 단축어이다: group_by() + summarise(n = n()).)

summarize(flights, delay=mean(dep_delay, na.rm=TRUE))

파이프로 여러 작업 결합

# 그룹화하고, 그다음 요약하고, 그다음 필터링하라.
delays <- flights %>% 
  group_by(dest)  %>%  #그룹화하고
  summarise(           # 요약하고
    count = n(),
    dist = mean(distance, na.rm = TRUE),
    delay = mean(arr_delay, na.rm = TRUE)
  )   %>% 
  filter(count > 20, dest != "HNL")  # 필터링

결측값

# na.rm 인수를 설정하지 않으면 결측값이 많이 생깁니다.
flights %>% 
  group_by(year, month, day) %>% 
  summarise(mean = mean(dep_delay))

카운트

카운트 n()
혹은, 결측이 아닌 값의 카운트 sum(!is.na(x))
를 포함하는 것이 좋습니다. 이렇게 하면 매우 적은 양의 데이터를 기반으로 결론을 도출하지 않는지 확인할 수 있습니다.

0개의 댓글

관련 채용 정보