쭈쌤
쭈쌤 Hello World

[R 데이터분석] 데이터 전처리

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 데이터 전처리≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[R 데이터분석] 데이터 전처리

데이터 전처리란 데이터를 본격적으로 분석하기 전에 분석에 적합하게 데이터를 가공하는 작업을 의미하는 것으로 데이터 가공(Data Manipulation), 데이터 핸들링(Data Handling)도 비슷한 의미로 사용되는 용어들 입니다.

데이터 전처리에서 수행되는 주요 작업들

  1. 행,열의 순서 변경 / 이름 변경
  2. 데이터 정렬
  3. 데이터 검색
  4. 행, 열 추가
  5. 행, 열 삭제
  6. 두 개 이상의 데이터 프레임 병합하기

#01. 필요한 패키지 참조 및 샘플 데이터 준비하기

패키지 설명
dplry 데이터 전처리에 가장 많이 사용되는 패키지
tibble R의 데이터프레임과 상호 보완적인 역할을 하는 패키지로서 tidyverse 패키지에 포함되어 있다.

패키지 설치 및 사용하기

1
2
3
4
5
6
7
REPO_URL <- "https://cran.seoul.go.kr/"

if (!require("dplyr"))     install.packages("dplyr", repos=REPO_URL)
library(dplyr)

if (!require("tidyverse")) install.packages("tidyverse", repos=REPO_URL)
library(tibble)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
Loading required package: tidyverse

-- Attaching packages --------------------------------------- tidyverse 1.3.0 --

√ggplot2 3.2.1     √purrr   0.3.3
√tidyr   1.0.0     √stringr 1.4.0
√readr   1.3.1     √forcats 0.4.0

-- Conflicts ------------------------------------------ tidyverse_conflicts() --
xdplyr::filter() masksstats::filter()
xdplyr::lag()    masksstats::lag()

샘플 데이터 준비

1
2
성적표 <- read.csv("http://itpaper.co.kr/demo/r/grade.csv", stringsAsFactors=F, fileEncoding="euc-kr")
성적표
▶ 출력결과

A data.frame: 5 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

#02. 데이터 순서 변경

1
생성될복사본 <- 원본[행순서 , 열순서]

1) 열 순서 변경하기

인덱스 번호로 변경하기

각 컬럼들에게는 1부터 카운트되는 일련번호가 부여되는데 이를 인덱스 번호라고 한다.

이 번로를 재배치 하여 순서를 변경할 수 있다.

1
2
성적표_순서변경1 <- 성적표[ , c(2, 1, 3, 4, 5, 6, 7)]
성적표_순서변경1
▶ 출력결과

A data.frame: 5 × 7

학년이름성별국어영어수학과학
<int><chr><chr><int><int><int><int>
1철수남자 98NA8864
2영희여자 88906272
1민수남자 9270NANA
3수현여자 63603170
4호영남자12050NA88

컬럼 이름으로 변경하기

1
2
성적표_순서변경2 <- 성적표[, c('학년','성별','이름', '국어', '수학', '영어', '과학')]
성적표_순서변경2
▶ 출력결과

A data.frame: 5 × 7

학년성별이름국어수학영어과학
<int><chr><chr><int><int><int><int>
1남자철수 9888NA64
2여자영희 88629072
1남자민수 92NA70NA
3여자수현 63316070
4남자호영120NA5088

재배치될 항목의 이름 중 누락되는 항목은 생성 결과에서 제외된다.

1
2
성적표_순서변경3 <- 성적표[, c('이름', '국어', '수학')]
성적표_순서변경3
▶ 출력결과

A data.frame: 5 × 3

이름국어수학
<chr><int><int>
철수 9888
영희 8862
민수 92NA
수현 6331
호영120NA

2) 행 순서 변경하기

변경하고자 하는 행의 인덱스 번호를 재배치 한다.

1
2
성적표_순서변경3 <- 성적표[c(5, 4, 3, 2, 1), ]
성적표_순서변경3
▶ 출력결과

A data.frame: 5 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
5호영4남자12050NA88
4수현3여자 63603170
3민수1남자 9270NANA
2영희2여자 88906272
1철수1남자 98NA8864

3) 행,열 순서를 한번에 변경하기

1
2
3
성적표_순서변경4 <- 성적표[c(5, 4, 3, 2, 1),
                           c('학년','성별','이름', '국어', '수학', '영어', '과학')]
성적표_순서변경4
▶ 출력결과

A data.frame: 5 × 7

학년성별이름국어수학영어과학
<int><chr><chr><int><int><int><int>
54남자호영120NA5088
43여자수현 63316070
31남자민수 92NA70NA
22여자영희 88629072
11남자철수 9888NA64

#03. 컬럼, 인덱스 이름 변경하기

1) 컬럼 이름 변경하기

1
생성될복사본 <- rename(원본, 새이름=원래이름, 새이름=원래이름, ...)
1
2
성적표_이름변경1 <- rename(성적표, name=이름, kor=국어, math=수학)
성적표_이름변경1
▶ 출력결과

A data.frame: 5 × 7

name학년성별kor영어math과학
<chr><int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

2) 인덱스 이름 변경하기

특정 컬럼을 인덱스로 지정하기

외부에서 가져온 데이터들은 인덱스 이름이 사용되지 않고 모든 변수가 컬럼으로 생성되기 때문에 인덱스를 사용해야 할 상황이라면 특정 컬럼을 인덱스로 변환해야 한다.

%>% 연산자는 dplry 패키지에 의해서 사용 가능한 기능으로 여러 개의 함수를 연속적으로 사용할 수 있도록 한다.

1
2
성적표_이름변경2 <- 성적표 %>% column_to_rownames('이름')
성적표_이름변경2
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

인덱스 이름 변경하기

재배치될 순서에 맞게 백터로 구성하여 rownames(데이터프레임)에 대입한다. 다른 기능과 다르게 원본에 즉시 반영되기 때문에 원본을 유지해야 하는 경우 copy() 함수를 사용하여 복사본을 만든 후 진행해야 한다.

복사본 만들기
1
2
성적표_이름변경3 <- 성적표_이름변경2
성적표_이름변경3
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88
1
2
rownames(성적표_이름변경3) <- c('cs','yh','ms','sh','hy')
성적표_이름변경3
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
cs1남자 98NA8864
yh2여자 88906272
ms1남자 9270NANA
sh3여자 63603170
hy4남자12050NA88

#04. 데이터 정렬하기

1) arrange() 함수

데이터 정렬을 수행한다.

특정 변수를 기준으로 오름차순 정렬

정렬 과정에서 인덱스 이름은 제거된다.

앞의 처리 과정을 통해 성적표_이름변경2에는 학생 이름이 인덱스로서 존재하고 있다.

1
2
국어점수정렬1 <- 성적표_이름변경2 %>% arrange(국어)
국어점수정렬1
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
3여자 63603170
2여자 88906272
1남자 9270NANA
1남자 98NA8864
4남자12050NA88

인덱스 이름을 유지하면서 정렬하기

rownames_to_column() 함수를 먼저 선행하여 인덱스 이름을 임시 컬럼으로 이동시킨 후 정렬을 수행하고 다시 원래대로 복원해야 한다.

인덱스 이름을 컬럼으로 변경
1
2
tmp1 <- 성적표_이름변경2 %>% rownames_to_column('학생이름');
tmp1
▶ 출력결과

A data.frame: 5 × 7

학생이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88
국어점수의 오름차순으로 정렬
1
2
tmp2 <- tmp1 %>% arrange(국어)
tmp2
▶ 출력결과

A data.frame: 5 × 7

학생이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
수현3여자 63603170
영희2여자 88906272
민수1남자 9270NANA
철수1남자 98NA8864
호영4남자12050NA88
학생이름 컬럼을 다시 인덱스로 변경
1
2
tmp3 <- tmp2 %>% column_to_rownames('학생이름')
tmp3
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
수현3여자 63603170
영희2여자 88906272
민수1남자 9270NANA
철수1남자 98NA8864
호영4남자12050NA88

2) dplyr 패키지의 chain 기능 활용하기

  • %>% 연산자를 연속적으로 사용하여 여러 개의 함수를 연결해서 사용할 수 있다.
  • 주의사항 : %>% 연산자는 반드시 한 행의 끝에 명시해야 함.

chain 기능을 활용하여 데이터 정렬 수행

1
2
3
4
5
국어점수정렬2 <- 성적표_이름변경2 %>%
                    rownames_to_column('학생이름') %>%
                    arrange(국어) %>%
                    column_to_rownames('학생이름')
국어점수정렬2
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
수현3여자 63603170
영희2여자 88906272
민수1남자 9270NANA
철수1남자 98NA8864
호영4남자12050NA88

3) 특정 변수를 기준으로 내림차순 정렬

정렬할 변수 이름에 desc() 함수를 적용한다.

1
2
3
4
5
수학점수정렬 <- 성적표_이름변경2 %>%
                    rownames_to_column('학생이름') %>%
                    arrange(desc(수학)) %>%
                    column_to_rownames('학생이름')
수학점수정렬
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
수현3여자 63603170
민수1남자 9270NANA
호영4남자12050NA88

4) 두 개 이상의 정렬 기준 정하기

첫 번째 정렬 기준의 값이 동일할 경우 두 번째 기준을 사용해서 정렬한다.

1
2
3
4
5
6
# 국어 점수가 동일할 경우 수학점수 역순으로 정렬
정렬df <- 성적표_이름변경2 %>%
            rownames_to_column('학생이름') %>%
            arrange(국어, desc(수학)) %>%
            column_to_rownames('학생이름')
정렬df
▶ 출력결과

A data.frame: 5 × 6

학년성별국어영어수학과학
<int><chr><int><int><int><int>
수현3여자 63603170
영희2여자 88906272
민수1남자 9270NANA
철수1남자 98NA8864
호영4남자12050NA88

#05. 데이터 검색(추출)

1) 행단위 검색

조건에 맞는 행을 걸러내기 위해 filter() 함수를 사용한다.

만약 인덱스가 포함된 DataFrame인 경우 검색 결과에서 인덱스는 제외된다.

기본 사용 방법

성적표에서 국어 점수가 90점 초과인 데이터만 추출하기.

1
2
df <- 성적표 %>% filter(국어 > 90)
df
▶ 출력결과

A data.frame: 3 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
철수1남자 98NA8864
민수1남자 9270NANA
호영4남자12050NA88

filter() 함수의 연산자

  • 비교 연산자
    • <, <=, >, >=, ==, !=
  • 산술 연산자 : +, -, *, /
    • 제곱: ^, **
    • 나눗셈의 몫: %/%
    • 나눗셈의 나머지 : %%
  • 논리 연산자
    • 또는: |
    • 그리고 : &
    • 매칭 확인 : %in%
영어와 과학이 모두 70 이상인 경우
1
2
df <- 성적표 %>% filter(영어 >= 70 & 과학 >= 70)
df
▶ 출력결과

A data.frame: 1 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
영희2여자88906272
%in% 연산자를 사용하여 여러 개의 값 중에서 하나 이상 일치하는 데이터 추출

학년 == 2 | 학년 == 3 과 같은 의미

1
2
df <- 성적표 %>% filter(학년 %in% c(2, 3))
df
▶ 출력결과

A data.frame: 2 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
영희2여자88906272
수현3여자63603170

2) 열단위 추출

데이터에 들어 있는 수많은 변수(열) 중 일부 변수만 추출하고자 할 때 select() 함수를 사용한다.

특정 변수만 추출하기

인덱스가 없는 데이터프레임에서 추출
1
2
국어점수 <- 성적표 %>% select(국어)
국어점수
▶ 출력결과

A data.frame: 5 × 1

국어
<int>
98
88
92
63
120
인덱스가 포함된 데이터프레임에서 추출

인덱스 이름도 함께 처리된다.

1
2
df <- 성적표_이름변경2 %>% select(국어)
df
▶ 출력결과

A data.frame: 5 × 1

국어
<int>
철수 98
영희 88
민수 92
수현 63
호영120

두 개 이상의 변수 추출하기

select() 함수를 호출하면서 추출하고자 하는 컬럼 이름을 콤마(,)로 구분하여 나열한다.

1
2
df <- 성적표 %>% select(국어, 수학)
df
▶ 출력결과

A data.frame: 5 × 2

국어수학
<int><int>
9888
8862
92NA
6331
120NA

특정 항목만 제외하기

- 연산자를 변수명 앞에 적용

1
2
df <- 성적표 %>% select(-과학)
df
▶ 출력결과

A data.frame: 5 × 6

이름학년성별국어영어수학
<chr><int><chr><int><int><int>
철수1남자 98NA88
영희2여자 889062
민수1남자 9270NA
수현3여자 636031
호영4남자12050NA

두 가지 이상 항목 제외

,로 구분하여 -연산자가 적용된 변수명 명시

1
2
df <- 성적표 %>% select(-영어, -과학)
df
▶ 출력결과

A data.frame: 5 × 5

이름학년성별국어수학
<chr><int><chr><int><int>
철수1남자 9888
영희2여자 8862
민수1남자 92NA
수현3여자 6331
호영4남자120NA

#06. 데이터 추가

1) 행단위 추가

아래 예제들은 성적표 라는 원본 데이터 프레임을 반복적으로 사용하므로 추가되는 행들에 대한 결과가 누적되지는 않는다.

기본 사용 방법

추가하고자 하는 행을 백터로 구성하여 rbind(원본, 추가될행) 형태로 처리하여 결과가 적용된 복사본을 반환받는다.

1
2
df <- rbind(성적표, c('영민', 3, '남자', 90, 80, 90, 62))
df
▶ 출력결과

A data.frame: 6 × 7

이름학년성별국어영어수학과학
<chr><chr><chr><chr><chr><chr><chr>
철수1남자98 NA8864
영희2여자88 906272
민수1남자92 70NANA
수현3여자63 603170
호영4남자12050NA88
영민3남자90 809062

추가되는 값들이 원본 데이터프레임의 열보다 적은 경우

값이 부족한 컬럼은 데이터가 처음부터 순환되어 적용된다.

1
2
df <- rbind(성적표, c('혜민', 2, '여자', 90, 80))
df
▶ 출력결과

A data.frame: 6 × 7

이름학년성별국어영어수학과학
<chr><chr><chr><chr><chr><chr><chr>
철수1남자98 NA88 64
영희2여자88 9062 72
민수1남자92 70NA NA
수현3여자63 6031 70
호영4남자12050NA 88
혜민2여자90 80혜민2

추가되는 값들이 원본 데이터프레임의 열보다 많은 경우

남는 데이터는 버려진다.

1
2
df <- rbind(성적표, c('호철', 3, '남자', 90, 80, 70, 60, 50, 40, 30))
df
▶ 출력결과

A data.frame: 6 × 7

이름학년성별국어영어수학과학
<chr><chr><chr><chr><chr><chr><chr>
철수1남자98 NA8864
영희2여자88 906272
민수1남자92 70NANA
수현3여자63 603170
호영4남자12050NA88
호철3남자90 807060

여러 줄을 추가하는 경우

추가될 행을 구성하는 백터들을 콤마(,)로 구분하여 나열한다.

1
2
3
4
df <- rbind(성적표, c('영민', 3, '남자', 90, 80, 90, 62),
                    c('혜민', 2, '여자', 90, 80, 92, 87),
                    c('호철', 3, '남자', 90, 80, 70, 60))
df
▶ 출력결과

A data.frame: 8 × 7

이름학년성별국어영어수학과학
<chr><chr><chr><chr><chr><chr><chr>
철수1남자98 NA8864
영희2여자88 906272
민수1남자92 70NANA
수현3여자63 603170
호영4남자12050NA88
영민3남자90 809062
혜민2여자90 809287
호철3남자90 807060

2) 열 단위 추가

개별값 지정하기

원본에 즉시 반영되므로 원본을 보관해야 할 경우 별도의 복사본을 생성하고 진행한다.

데이터프레임이름$새로운컬럼 <- 추가할백터 형식으로 처리한다.

추가되는 값의 수가 데이터프레임의 행의 수 보다 적은 경우 에러가 발생한다.

1
2
3
성적표copy <- 성적표
성적표copy$역사 <- c(90, 43, 67, 86, 34)
성적표copy
▶ 출력결과

A data.frame: 5 × 8

이름학년성별국어영어수학과학역사
<chr><int><chr><int><int><int><int><dbl>
철수1남자 98NA886490
영희2여자 8890627243
민수1남자 9270NANA67
수현3여자 6360317086
호영4남자12050NA8834

단일값 추가하기

스칼라 값을 추가할 경우 모든 행에 대해 일괄 적용된다.

1
2
3
성적표copy <- 성적표
성적표copy$미술 <- 100
성적표copy
▶ 출력결과

A data.frame: 5 × 8

이름학년성별국어영어수학과학미술
<chr><int><chr><int><int><int><int><dbl>
철수1남자 98NA8864100
영희2여자 88906272100
민수1남자 9270NANA100
수현3여자 63603170100
호영4남자12050NA88100

transform(데이터프레임, 추가할컬럼) 함수를 사용한 열 추가

단일 컬럼 추가하기

처리 결과가 적용된 복사본이 생성되므로 별도의 복사본을 만들 필요가 없다.

1
2
df <- transform(성적표, 역사=c(90, 43, 67, 86, 34))
df
▶ 출력결과

A data.frame: 5 × 8

이름학년성별국어영어수학과학역사
<chr><int><chr><int><int><int><int><dbl>
철수1남자 98NA886490
영희2여자 8890627243
민수1남자 9270NANA67
수현3여자 6360317086
호영4남자12050NA8834
여러 컬럼 추가하기

추가할 컬럼의 정보들을 콤마(,)로 구분한다.

1
2
df <- transform(성적표, 역사=c(90, 43, 67, 86, 34), 음악=100, 철학=c(72, 88, 90, 76, 81))
df
▶ 출력결과

A data.frame: 5 × 10

이름학년성별국어영어수학과학역사음악철학
<chr><int><chr><int><int><int><int><dbl><dbl><dbl>
철수1남자 98NA88649010072
영희2여자 889062724310088
민수1남자 9270NANA6710090
수현3여자 636031708610076
호영4남자12050NA883410081

3) 파생변수 추가하기

mutate() 함수를 사용하여 기존의 데이터를 기반으로 계산되어진 새로운 컬럼을 추가할 수 있다.

기존 데이터에 파생변수 추가하기

mutate()에 새로 만들 변수명과 변수를 만들 때 사용할 공식을 지정한다.

결측치(NA)가 있는 행은 계산할 수 없다.

1
2
3
df <- 성적표 %>%
        mutate(총점=국어+영어+수학+과학)
df
▶ 출력결과

A data.frame: 5 × 8

이름학년성별국어영어수학과학총점
<chr><int><chr><int><int><int><int><int>
철수1남자 98NA8864 NA
영희2여자 88906272312
민수1남자 9270NANA NA
수현3여자 63603170224
호영4남자12050NA88 NA

두 개 이상의 파생변수 만들기

mutate()함수에서 콤마(,)로 구분하여 일괄 처리 할 수 있다.

1
2
3
df <- 성적표 %>%
        mutate(총점=국어+영어+수학+과학, 평균=총점/4)
df
▶ 출력결과

A data.frame: 5 × 9

이름학년성별국어영어수학과학총점평균
<chr><int><chr><int><int><int><int><int><dbl>
철수1남자 98NA8864 NANA
영희2여자 8890627231278
민수1남자 9270NANA NANA
수현3여자 6360317022456
호영4남자12050NA88 NANA

chain 기능을 활용한 연속 처리

추가된 변수는 다른 함수에서 즉시 연결해서 사용 가능하다.

아래의 예시는 mutate()에서 생성한 파생변수를 arrange()에서 받아서 사용하고 있다.

1
2
3
4
df <- 성적표 %>%
        mutate(총점=국어+영어+수학+과학, 평균=총점/4) %>%
        arrange(총점)
df
▶ 출력결과

A data.frame: 5 × 9

이름학년성별국어영어수학과학총점평균
<chr><int><chr><int><int><int><int><int><dbl>
수현3여자 6360317022456
영희2여자 8890627231278
철수1남자 98NA8864 NANA
민수1남자 9270NANA NANA
호영4남자12050NA88 NANA

조건에 따른 값 선택하기

mutate()함수에서 ifelse()함수의 결과를 생성하도록 지정한다.

또한 mutate() 함수역시 %>% 연산자를 사용하여 chain 기능을 사용할 수 있다.

1
2
3
4
df <- 성적표 %>%
        mutate(총점=국어+영어+수학+과학, 평균=총점/4) %>%
        mutate(결과=ifelse(평균 >= 70, '합격', '불합격'))
df
▶ 출력결과

A data.frame: 5 × 10

이름학년성별국어영어수학과학총점평균결과
<chr><int><chr><int><int><int><int><int><dbl><chr>
철수1남자 98NA8864 NANANA
영희2여자 8890627231278합격
민수1남자 9270NANA NANANA
수현3여자 6360317022456불합격
호영4남자12050NA88 NANANA

여러 조건 중에서 선택적으로 값을 추가하기

case_when() 함수를 사용하여 여러 조건 중에서 선택적으로 값을 지정하기

1
2
3
4
5
6
7
8
df <- 성적표 %>%
        mutate(총점=국어+영어+수학+과학, 평균=총점/4) %>%
        mutate(결과=ifelse(평균 >= 70, '합격', '불합격')) %>%
        mutate(학점=case_when(평균 > 90 ~ "A",
                              평균 > 80 ~ "B",
                              평균 > 70 ~ "C",
                              TRUE ~ "F"))
df
▶ 출력결과

A data.frame: 5 × 11

이름학년성별국어영어수학과학총점평균결과학점
<chr><int><chr><int><int><int><int><int><dbl><chr><chr>
철수1남자 98NA8864 NANANA F
영희2여자 8890627231278합격 C
민수1남자 9270NANA NANANA F
수현3여자 6360317022456불합격F
호영4남자12050NA88 NANANA F

#07. 데이터 삭제

1) 행 삭제하기

데이터프레임이름[!(삭제조건), ] 형식으로 연산을 수행한 결과를 반환받는다.

느낌표와 콤마 주의

1
2
df <- 성적표[!(성적표$국어 > 100 ), ]
df
▶ 출력결과

A data.frame: 4 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
1철수1남자98NA8864
2영희2여자88906272
3민수1남자9270NANA
4수현3여자63603170

2) 열 삭제하기

컬럼 위치에 따른 삭제

삭제할 컬럼의 위치를 담는 백터에 대해 -연산자 를 적용.

컬럼의 이름이 아닌 1부터 시작하는 인덱스 번호를 사용하여 삭제해야 한다.

1
2
df <- 성적표[ , -c(1, 2, 3)]
df
▶ 출력결과

A data.frame: 5 × 4

국어영어수학과학
<int><int><int><int>
98NA8864
88906272
9270NANA
63603170
12050NA88

컬럼 이름에 의한 삭제

names(데이터프레임)에 의해 컬럼의 이름을 반환받아 이 중에서 삭제 대상을 의미하는 벡터와 겹치지 않는 것들만 추려낸다.

엄밀히 말하면 삭제는 아니고, 지정한 조건에 맞지 않는 것들만 추려내는 형태.

1
2
3
drop_target = c('학년', '성별')
df <- 성적표[ , !(names(성적표) %in% drop_target)]
df
▶ 출력결과

A data.frame: 5 × 5

이름국어영어수학과학
<chr><int><int><int><int>
철수 98NA8864
영희 88906272
민수 9270NANA
수현 63603170
호영12050NA88

#08. 데이터프레임간의 병합

1) 열 단위로 결합하기

두 개의 데이터 프레임을 결합하는 기능

1
변수 <- left_join(프레임1, 프레임2,  프레임n, by="기준열")
  • 나열된 프레임들을 by속성에 설정한 열이 동일한 값들을 기준으로 합친다.
  • 데이터를 가로로 합치는 것은 기존 데이터에 변수(열)을 추가한다고 볼 수 있다.
  • 중간고사 데이터에 기말고사 데이터를 합친다면 이는 가로로 합치는 작업이 된다.

샘플 데이터 준비

1
2
3
4
학생정보 <- data.frame(학생=c("철수", "영희", "호영"),
                       학년=c(1, 1, 3),
                       성별=c("남자","여자", "남자"))
학생정보
▶ 출력결과

A data.frame: 3 × 3

학생학년성별
<fct><dbl><fct>
철수1남자
영희1여자
호영3남자
1
2
3
4
5
6
성적 <- data.frame(이름=c("영희", "민수", "수현"),
                   국어=c(88, 92, 63),
                   영어=c(90, 70, 60),
                   수학=c(62, NA, 31),
                   과학=c(72, NA, 70))
성적
▶ 출력결과

A data.frame: 3 × 5

이름국어영어수학과학
<fct><dbl><dbl><dbl><dbl>
영희88906272
민수9270NANA
수현63603170

왼쪽 데이터를 기준으로 결합하기

왼쪽에 지정된 데이터프레임(학생정보)에 대한 전체 데이터를 유지하고, 오른쪽 데이터(성적)에서 이름 열을 기준으로 매칭되는 데이터들을 찾아 결합한다.

기준열간의 데이터가 동일하지 않으면 경고메시지가 표시된다. (무시)

1
left_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과

A data.frame: 3 × 7

학생학년성별국어영어수학과학
<chr><dbl><fct><dbl><dbl><dbl><dbl>
철수1남자NANANANA
영희1여자88906272
호영3남자NANANANA

오른쪽 데이터를 기준으로 결합하기

1
right_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과

A data.frame: 3 × 7

학생학년성별국어영어수학과학
<chr><dbl><fct><dbl><dbl><dbl><dbl>
영희 1여자88906272
민수NANA 9270NANA
수현NANA 63603170

전체 데이터 결합하기

1
full_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과

A data.frame: 5 × 7

학생학년성별국어영어수학과학
<chr><dbl><fct><dbl><dbl><dbl><dbl>
철수 1남자NANANANA
영희 1여자88906272
호영 3남자NANANANA
민수NANA 9270NANA
수현NANA 63603170

기준열의 데이터가 매칭되는 것만 결합하기

양쪽에서 기준열의 값이 공통적으로 존재하는 행만 결합

1
inner_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과

A data.frame: 1 × 7

학생학년성별국어영어수학과학
<chr><dbl><fct><dbl><dbl><dbl><dbl>
영희1여자88906272

semi_join

양쪽에서 기준열의 값이 공통적으로 존재하는 행만 결합하되 왼쪽 데이터의 열만 갖는다.

결합이라기 보다는 왼쪽 데이터에서 오른쪽과 겹치는 항목만 걸러낸다고 보는 것이 맞다.

1
semi_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과

A data.frame: 1 × 3

학생학년성별
<fct><dbl><fct>
영희1여자

anti_join

semi_join의 반대 기능.

왼쪽 데이터에서 오른쪽 데이터와 겹치지 않는 행만 걸러낸다.

1
anti_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과

A data.frame: 2 × 3

학생학년성별
<fct><dbl><fct>
철수1남자
호영3남자

2) 행단위로 결합하기

샘플데이터 준비

1
2
3
4
5
6
7
성적표1 <- data.frame(이름=c("철수", "영희", "민수"),
                      학년=c(1, 1, 2),
                      성별=c("남자","여자", "남자"),
                      국어=c(98, 88, 92),
                      영어=c(NA, 90, 70),
                      수학=c(88, 62, NA))
성적표1
▶ 출력결과

A data.frame: 3 × 6

이름학년성별국어영어수학
<fct><dbl><fct><dbl><dbl><dbl>
철수1남자98NA88
영희1여자889062
민수2남자9270NA
1
2
3
4
5
6
7
성적표2 <- data.frame(이름=c("철수", "수현", "호영"),
                     학년=c(1, 2, 3),
                     성별=c("남자", "여자", "남자"),
                     국어=c(98, 63, 120),
                     영어=c(NA, 60, 50),
                     과학=c(64, 70, 88))
성적표2
▶ 출력결과

A data.frame: 3 × 6

이름학년성별국어영어과학
<fct><dbl><fct><dbl><dbl><dbl>
철수1남자 98NA64
수현2여자 636070
호영3남자1205088

행 단위로 데이터 결합하기

양쪽의 DataFrmae에서 중첩되지 않는 열은 결측치(NA)로 처리되어 병합된다.

단순한 병합처리이기 때문에 데이터의 중복 여부는 검사하지 않는다.

1
bind_rows(성적표1, 성적표2)
▶ 출력결과

A data.frame: 6 × 7

이름학년성별국어영어수학과학
<chr><dbl><fct><dbl><dbl><dbl><dbl>
철수1남자 98NA88NA
영희1여자 889062NA
민수2남자 9270NANA
철수1남자 98NANA64
수현2여자 6360NA70
호영3남자12050NA88
Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 데이터 전처리≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus