dplyr in R
※ 데이터전처리 패키지: dplyr
- chain function : %>% 파이프연산자를 사용하여 매우 직관적임
- 코드 가독성이 높음
- 코드 유지보수가 용이함
- 매우 빠른 속도
# 일반적인 코드
> 함수3(함수2(함수1(df,x),y,z))
# dplyr을 사용한 코드
> df %>%
함수1(x) %>%
함수2(x) %>%
함수3(x) %>%
...
■ filter
> df %>% filter(조건)
데이터 내에서 조건을 만족하는 행을 선택하여 출력
# 일반적인 코드
## 성별이 남자인 데이터만 추출
> df[gender == "M", ]
# dplyr을 사용한 코드
## 성별이 남자인 데이터만 추출
> df %>%
filter(gender == "M")
## 성별이 남자이면서 점수가 90점 이상인 데이터만 추출
> df %>%
filter(gender == "M" & score >= 90)
■ select
> df %>% select()
- 원하는 컬럼만 선택하여 출력
- 사용법
- 데이터에서 컬럼A를 출력
- df %>% select(컬럼A)
- 데이터에서 컬럼A를 제외하고 출력
- df %>% select(-컬럼A)
- 데이터에서 컬럼A를 출력
# df에서 컬럼 colA들 값 출력
> df %>%
select(colA)
# df에서 컬럼 colA~ colD들 값 출력
> df %>%
select(colA : colD)
# df에서 컬럼 colA와 colB를 제외하고 출력
> df %>%
select(-colA, colB)
■ arrange
> df %>% arrange()
- 데이터를 오름/내림차순으로 정렬
- 사용법
- 컬럼을 기준으로 오름차순 정렬
- df %>% arrange(컬럼)
- 컬럼을 기준으로 내림차순 정렬
- df %>% arrange(desc(컬럼))
- 컬럼을 기준으로 오름차순 정렬
# id 기준으로 오름차순 정렬
> df %>%
arrange(id)
# dept_no로 먼저 오름차순 정렬,
# dept_no가 같을 경우에는 join_date로 내림차순 정렬
> df %>%
arrange(dept_no, desc(join_date))
■ distinct
> df %>% distinct()
- 데이터 내에서 중복된 값을 제거하고 출력
- 사용법
- 데이터 내의 해당 컬럼의 중복된 값 제거하고, 해당 컬럼만 출력
- df %>% distinct(컬럼)
- 데이터 내의 해당 컬럼의 중복된 값을 제거하고, 모든 행 출력
- df %>% distinct(컬럼, .keep_all = TRUE)
- 데이터 내의 해당 중복된 행을 제거하고 출력
- df %>% distinct()
- 데이터 내의 해당 컬럼의 중복된 값 제거하고, 해당 컬럼만 출력
■ group_by와 summarize
> df %>% group_by() %>% summarize()
- 데이터 내에서 특정 컬럼을 기준으로 요약한 값 출력
- 사용법
- df %>% group_by(컬럼1) %>% summarize(함수(컬럼2))
- 데이터를 컬럼1을 기준으로, 컬럼2를 함수로 집계
# 다음 두 줄은 같은 결과값을 출력함
> mean(df$base)
> df %>% summarize(mean(basse))
# 각 성별의 개수 출력
> df %>%
group_by(gender) %>%
summarize(n())
# 각 성별의 평균 점수 출력
> df %>%
group_by(gender) %>%
summarize(mean(score))
# 각 성별의 평균 점수와 합계 점수를 출력
##평균 점수는 컬럼명(avg), 합계 점수는 컬럼명(sum)으로 출력
> df %>%
group_by(gender) %>%
summarize(avg = mean(score),
sum = sum(score))
# 여러개의 컬럼을 그룹화하기
> df %>%
group_by(gender, dept_no) %>%
summarize(avg_base = mean(base))
■ mutate
> df %>% mutate()
- 새로운 컬럼 생성
- 사용법
- df %>% mutate(새로운 컬럼명 = 값1)
- 값1을 갖는 새로운 컬럼을 생성
# 일반적인 코드
## 각각의 컬럼을 따로 생성
> df$total <- df$base + df$bonus
> df$special_bonus <- df$base * 0.1
# dplyr을 사용한 코드
> df %>%
mutate(total = base + bonus,
special_bonus = total * 0.1)
■ sample_n과 sample_frac
> df %>% sample_n()
> df %>% sample_frac()
- 데이터에서 행을 랜덤 샘플링 후 출력
- 사용법
- 숫자만큼의 행을 랜덤 샘플링
- df %>% sample_n(숫자)
- 비율만큼의 행을 랜덤 샘플링
- df %>% sample_n(비율)
- 숫자만큼의 행을 랜덤 샘플링
# 10개의 행을 랜덤으로 뽑아서 출력
> df %>%
sample_n(10)
# 전체 데이터에서 30%의 행을 랜덤으로 뽑아서 출력
> df %>%
sample_frac(0.3)
■ bind_rows와 bind_cols
□ bind_rows
> df1 %>% bind_rows(df2)
- 데이터를 행으로 결합
- rbind() 함수에서 불가능한 것이 가능함
- 빈 값은 NA로 채움
- 열의 순서가 달라도 결합이 됨
- 사용법
- df1과 df2를 행으로 결합(아래로 이어붙임)
- df1 %>% bind_rows(df2)
□ bind_cols
> df1 %>% bind_cols(df2)
- 데이터를 열방향으로 결합
- 사용법
- df1과 df2를 열방향 결합(옆으로 이어붙임)
- df1 %>% bind_cols(df2)
■ join 함수
- 두 개의 data frame을 결합하고자 할 때
□ inner_join
> df1 %>% inner_join(df2)
- 특정 컬럼을 기준으로 결합(교집합)
- 사용법
- df1과 df2를 기준열에 맞추어 교집행만 살려서 결합
- 만약 기준열이 같을 경우 by 인자는 생략 가능
- df1 %>% inner_join(df2, by = c(“df1의 기준열 = df2의 기준열”))
□ full_join
> df1 %>% full_join(df2)
- 특정 컬럼을 기준으로 결합(합집합)
- 사용법
- df1과 df2를 기준열에 맞추어 모든 행을 살려서 결합
- 만약 기준열이 같을 경우 by 인자는 생략 가능
- df1 %>% full_join(df2, by = c(“df1의 기준열 = df2의 기준열”))
□ left_join / right_join
> df1 %>% left_join(df2)
> df1 %>% right_join(df2)
- 특정 컬럼을 기준으로 결합
- 사용법
◎ left_join- df1과 df2를 기준열에 맞추어 df1의 행은 모두 살려서 결합
- df1 %>% left_join(df2, by = c(“df1의 기준열 = df2의 기준열”))
◎ right_join
- df1과 df2를 기준열에 맞추어 df2의 행은 모두 살려서 결합
- df1 %>% right_join(df2, by = c(“df1의 기준열 = df2의 기준열”))
□ anti_join
> df1 %>% anti_join(df2)
- 두 개의 data frame을 비교하여 첫 번째 data frame에는 있지만 두 번째 data frame에는 없는 행들을 반환
- 두 data frame을 결합하여 두 번째 data frame에는 없는 행들을 제거하는 역할
- 사용법
- df1 %>% anti_join(df2, by = c(“df1의 기준열 = df2의 기준열”))
■ Set Operation 함수
- 여러개의 값이 같을 때 결합하고 싶으면
□ union
> union(df1, df2)
- rbind는 단순히 데이터를 아래로 이어 붙였다면, union함수는 중복된 행은 제거하고 붙임 (합집합)
- 두 data frame의 컬럼명 순서에 영향을 받지 않음. 단, 컬럼명은 동일해야 함
- 사용법
- df1과 df2를 rbind하여 중복된 행은 제거함
- union(df1, df2)
□ intersect
> intersect(df1, df2)
- 두 개의 data frame의 중복된 행 출력
- 두 data frame의 컬럼명 순서에 영향을 받지 않음. 단, 컬럼명은 동일해야 함
□ setdiff
> setdiff(df1, df2)
- 두 개의 data frame의 차집합
- 두 data frame의 컬럼명 순서에 영향을 받지 않음. 단, 컬럼명은 동일해야 함
■ all.equal
> all.equal(df1, df2)
- 두 data frame이 완전히 동일한지를 check
- 두 data frame의 컬럼 순서가 다르면, 무엇이 얼마나 다른지 알려줌.
■ lead() / lag()
□ lead()
- 값을 위로 올림
- 사용법
- lead(df$colA) # vector 출력
> df %>%
mutate(next_colA = lead(colA))
□ lag()
- 값을 아래로 한칸 내림
- 사용법
- lag(df$colA) # vector 출력
> df %>%
mutate(prev_colA = lag(colA))
■ 순위 확인 함수
□ row_number()
> row_number()
- vector 값들의 순위를 확인함
- 크기가 무조건 +1 씩
□ min_rank()
> min_rank()
- vector 값들의 순위를 확인함
- 같은 값들은 같은 크기로, 그 다음 값들은 밀린 숫자만큼 +됨
□ dense_rank
> dense_rank()
- vector 값들의 순위를 확인함
- 같은 값들은 같은 크기로, 그 다음 값은 +1
■ cummean - 누적평균
- 그룹별로 행을 하나씩 이동해가며 누적평균을 반환
- group_by를 사용하면 각 그룹은 서로 cummean에 방해받지 않는다.
> df %>% mutate(cum_avg = cummean(avg))
> df %>% group_by(~~) %>% mutate(cum_avg = cummean(avg))
■ slice()
- 행을 기준으로 데이터를 출력
> df %>% slice(출력할 행 번호)
댓글남기기