Rdata 데이터전처리
ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪Rdata 데이터전처리≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.
데이터 전처리란 데이터를 본격적으로 분석하기 전에 분석에 적합하게 데이터를 가공하는 작업을 의미하는 것으로 데이터 가공(Data Manipulation), 데이터 핸들링(Data Handling)도 비슷한 의미로 사용되는 용어들 입니다.
데이터 전처리에서 수행되는 주요 작업들
- 행,열의 순서 변경 / 이름 변경
- 데이터 정렬
- 데이터 검색
- 행, 열 추가
- 행, 열 삭제
- 두 개 이상의 데이터 프레임 병합하기
#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 | 남자 | 98 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
#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 | 철수 | 남자 | 98 | NA | 88 | 64 |
2 | 영희 | 여자 | 88 | 90 | 62 | 72 |
1 | 민수 | 남자 | 92 | 70 | NA | NA |
3 | 수현 | 여자 | 63 | 60 | 31 | 70 |
4 | 호영 | 남자 | 120 | 50 | NA | 88 |
컬럼 이름으로 변경하기
1
2
성적표_순서변경2 <- 성적표[, c('학년','성별','이름', '국어', '수학', '영어', '과학')]
성적표_순서변경2
▶ 출력결과
A data.frame: 5 × 7
학년 | 성별 | 이름 | 국어 | 수학 | 영어 | 과학 |
---|---|---|---|---|---|---|
<int> | <chr> | <chr> | <int> | <int> | <int> | <int> |
1 | 남자 | 철수 | 98 | 88 | NA | 64 |
2 | 여자 | 영희 | 88 | 62 | 90 | 72 |
1 | 남자 | 민수 | 92 | NA | 70 | NA |
3 | 여자 | 수현 | 63 | 31 | 60 | 70 |
4 | 남자 | 호영 | 120 | NA | 50 | 88 |
재배치될 항목의 이름 중 누락되는 항목은 생성 결과에서 제외된다.
1
2
성적표_순서변경3 <- 성적표[, c('이름', '국어', '수학')]
성적표_순서변경3
▶ 출력결과
A data.frame: 5 × 3
이름 | 국어 | 수학 |
---|---|---|
<chr> | <int> | <int> |
철수 | 98 | 88 |
영희 | 88 | 62 |
민수 | 92 | NA |
수현 | 63 | 31 |
호영 | 120 | NA |
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 | 남자 | 120 | 50 | NA | 88 |
4 | 수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
3 | 민수 | 1 | 남자 | 92 | 70 | NA | NA |
2 | 영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
1 | 철수 | 1 | 남자 | 98 | NA | 88 | 64 |
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> | |
5 | 4 | 남자 | 호영 | 120 | NA | 50 | 88 |
4 | 3 | 여자 | 수현 | 63 | 31 | 60 | 70 |
3 | 1 | 남자 | 민수 | 92 | NA | 70 | NA |
2 | 2 | 여자 | 영희 | 88 | 62 | 90 | 72 |
1 | 1 | 남자 | 철수 | 98 | 88 | NA | 64 |
#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 | 남자 | 98 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
2) 인덱스 이름 변경하기
특정 컬럼을 인덱스로 지정하기
외부에서 가져온 데이터들은 인덱스 이름이 사용되지 않고 모든 변수가 컬럼으로 생성되기 때문에 인덱스를 사용해야 할 상황이라면 특정 컬럼을 인덱스로 변환해야 한다.
%>%
연산자는 dplry 패키지에 의해서 사용 가능한 기능으로 여러 개의 함수를 연속적으로 사용할 수 있도록 한다.
1
2
성적표_이름변경2 <- 성적표 %>% column_to_rownames('이름')
성적표_이름변경2
▶ 출력결과
A data.frame: 5 × 6
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
---|---|---|---|---|---|---|
<int> | <chr> | <int> | <int> | <int> | <int> | |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
인덱스 이름 변경하기
재배치될 순서에 맞게 백터로 구성하여 rownames(데이터프레임)
에 대입한다. 다른 기능과 다르게 원본에 즉시 반영되기 때문에 원본을 유지해야 하는 경우 copy()
함수를 사용하여 복사본을 만든 후 진행해야 한다.
복사본 만들기
1
2
성적표_이름변경3 <- 성적표_이름변경2
성적표_이름변경3
▶ 출력결과
A data.frame: 5 × 6
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
---|---|---|---|---|---|---|
<int> | <chr> | <int> | <int> | <int> | <int> | |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
1
2
rownames(성적표_이름변경3) <- c('cs','yh','ms','sh','hy')
성적표_이름변경3
▶ 출력결과
A data.frame: 5 × 6
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
---|---|---|---|---|---|---|
<int> | <chr> | <int> | <int> | <int> | <int> | |
cs | 1 | 남자 | 98 | NA | 88 | 64 |
yh | 2 | 여자 | 88 | 90 | 62 | 72 |
ms | 1 | 남자 | 92 | 70 | NA | NA |
sh | 3 | 여자 | 63 | 60 | 31 | 70 |
hy | 4 | 남자 | 120 | 50 | NA | 88 |
#04. 데이터 정렬하기
1) arrange() 함수
데이터 정렬을 수행한다.
특정 변수를 기준으로 오름차순 정렬
정렬 과정에서 인덱스 이름은 제거된다.
앞의 처리 과정을 통해 성적표_이름변경2에는 학생 이름이 인덱스로서 존재하고 있다.
1
2
국어점수정렬1 <- 성적표_이름변경2 %>% arrange(국어)
국어점수정렬1
▶ 출력결과
A data.frame: 5 × 6
학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|
<int> | <chr> | <int> | <int> | <int> | <int> |
3 | 여자 | 63 | 60 | 31 | 70 |
2 | 여자 | 88 | 90 | 62 | 72 |
1 | 남자 | 92 | 70 | NA | NA |
1 | 남자 | 98 | NA | 88 | 64 |
4 | 남자 | 120 | 50 | NA | 88 |
인덱스 이름을 유지하면서 정렬하기
rownames_to_column()
함수를 먼저 선행하여 인덱스 이름을 임시 컬럼으로 이동시킨 후
정렬을 수행하고 다시 원래대로 복원해야 한다.
인덱스 이름을 컬럼으로 변경
1
2
tmp1 <- 성적표_이름변경2 %>% rownames_to_column('학생이름');
tmp1
▶ 출력결과
A data.frame: 5 × 7
학생이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
국어점수의 오름차순으로 정렬
1
2
tmp2 <- tmp1 %>% arrange(국어)
tmp2
▶ 출력결과
A data.frame: 5 × 7
학생이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
학생이름 컬럼을 다시 인덱스로 변경
1
2
tmp3 <- tmp2 %>% column_to_rownames('학생이름')
tmp3
▶ 출력결과
A data.frame: 5 × 6
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
---|---|---|---|---|---|---|
<int> | <chr> | <int> | <int> | <int> | <int> | |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
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 | 여자 | 63 | 60 | 31 | 70 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
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 | 남자 | 98 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
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 | 여자 | 63 | 60 | 31 | 70 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
#05. 데이터 검색(추출)
1) 행단위 검색
조건에 맞는 행을 걸러내기 위해 filter()
함수를 사용한다.
만약 인덱스가 포함된 DataFrame인 경우 검색 결과에서 인덱스는 제외된다.
기본 사용 방법
성적표에서 국어 점수가 90점 초과인 데이터만 추출하기.
1
2
df <- 성적표 %>% filter(국어 > 90)
df
▶ 출력결과
A data.frame: 3 × 7
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
filter() 함수의 연산자
- 비교 연산자
<
,<=
,>
,>=
,==
,!=
- 산술 연산자 :
+
,-
,*
,/
- 제곱:
^
,**
- 나눗셈의 몫:
%/%
- 나눗셈의 나머지 :
%%
- 제곱:
- 논리 연산자
- 또는:
|
- 그리고 :
&
- 매칭 확인 :
%in%
- 또는:
영어와 과학이 모두 70 이상인 경우
1
2
df <- 성적표 %>% filter(영어 >= 70 & 과학 >= 70)
df
▶ 출력결과
A data.frame: 1 × 7
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
%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 | 여자 | 88 | 90 | 62 | 72 |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
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> |
98 | 88 |
88 | 62 |
92 | NA |
63 | 31 |
120 | NA |
특정 항목만 제외하기
-
연산자를 변수명 앞에 적용
1
2
df <- 성적표 %>% select(-과학)
df
▶ 출력결과
A data.frame: 5 × 6
이름 | 학년 | 성별 | 국어 | 영어 | 수학 |
---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> |
철수 | 1 | 남자 | 98 | NA | 88 |
영희 | 2 | 여자 | 88 | 90 | 62 |
민수 | 1 | 남자 | 92 | 70 | NA |
수현 | 3 | 여자 | 63 | 60 | 31 |
호영 | 4 | 남자 | 120 | 50 | NA |
두 가지 이상 항목 제외
,
로 구분하여 -
연산자가 적용된 변수명 명시
1
2
df <- 성적표 %>% select(-영어, -과학)
df
▶ 출력결과
A data.frame: 5 × 5
이름 | 학년 | 성별 | 국어 | 수학 |
---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> |
철수 | 1 | 남자 | 98 | 88 |
영희 | 2 | 여자 | 88 | 62 |
민수 | 1 | 남자 | 92 | NA |
수현 | 3 | 여자 | 63 | 31 |
호영 | 4 | 남자 | 120 | NA |
#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 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
영민 | 3 | 남자 | 90 | 80 | 90 | 62 |
추가되는 값들이 원본 데이터프레임의 열보다 적은 경우
값이 부족한 컬럼은 데이터가 처음부터 순환되어 적용된다.
1
2
df <- rbind(성적표, c('혜민', 2, '여자', 90, 80))
df
▶ 출력결과
A data.frame: 6 × 7
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> |
철수 | 1 | 남자 | 98 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 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 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
호철 | 3 | 남자 | 90 | 80 | 70 | 60 |
여러 줄을 추가하는 경우
추가될 행을 구성하는 백터들을 콤마(,
)로 구분하여 나열한다.
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 | NA | 88 | 64 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
민수 | 1 | 남자 | 92 | 70 | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 |
영민 | 3 | 남자 | 90 | 80 | 90 | 62 |
혜민 | 2 | 여자 | 90 | 80 | 92 | 87 |
호철 | 3 | 남자 | 90 | 80 | 70 | 60 |
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 | 남자 | 98 | NA | 88 | 64 | 90 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 43 |
민수 | 1 | 남자 | 92 | 70 | NA | NA | 67 |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 86 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | 34 |
단일값 추가하기
스칼라 값을 추가할 경우 모든 행에 대해 일괄 적용된다.
1
2
3
성적표copy <- 성적표
성적표copy$미술 <- 100
성적표copy
▶ 출력결과
A data.frame: 5 × 8
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | 미술 |
---|---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> | <dbl> |
철수 | 1 | 남자 | 98 | NA | 88 | 64 | 100 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 100 |
민수 | 1 | 남자 | 92 | 70 | NA | NA | 100 |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 100 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | 100 |
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 | 남자 | 98 | NA | 88 | 64 | 90 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 43 |
민수 | 1 | 남자 | 92 | 70 | NA | NA | 67 |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 86 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | 34 |
여러 컬럼 추가하기
추가할 컬럼의 정보들을 콤마(,
)로 구분한다.
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 | 남자 | 98 | NA | 88 | 64 | 90 | 100 | 72 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 43 | 100 | 88 |
민수 | 1 | 남자 | 92 | 70 | NA | NA | 67 | 100 | 90 |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 86 | 100 | 76 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | 34 | 100 | 81 |
3) 파생변수 추가하기
mutate()
함수를 사용하여 기존의 데이터를 기반으로 계산되어진 새로운 컬럼을 추가할 수 있다.
기존 데이터에 파생변수 추가하기
mutate()에 새로 만들 변수명과 변수를 만들 때 사용할 공식을 지정한다.
결측치(NA)가 있는 행은 계산할 수 없다.
1
2
3
df <- 성적표 %>%
mutate(총점=국어+영어+수학+과학)
df
▶ 출력결과
A data.frame: 5 × 8
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | 총점 |
---|---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> | <int> |
철수 | 1 | 남자 | 98 | NA | 88 | 64 | NA |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 312 |
민수 | 1 | 남자 | 92 | 70 | NA | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 224 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | NA |
두 개 이상의 파생변수 만들기
mutate()
함수에서 콤마(,
)로 구분하여 일괄 처리 할 수 있다.
1
2
3
df <- 성적표 %>%
mutate(총점=국어+영어+수학+과학, 평균=총점/4)
df
▶ 출력결과
A data.frame: 5 × 9
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | 총점 | 평균 |
---|---|---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> | <int> | <dbl> |
철수 | 1 | 남자 | 98 | NA | 88 | 64 | NA | NA |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 312 | 78 |
민수 | 1 | 남자 | 92 | 70 | NA | NA | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 224 | 56 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | NA | NA |
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 | 여자 | 63 | 60 | 31 | 70 | 224 | 56 |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 312 | 78 |
철수 | 1 | 남자 | 98 | NA | 88 | 64 | NA | NA |
민수 | 1 | 남자 | 92 | 70 | NA | NA | NA | NA |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | NA | NA |
조건에 따른 값 선택하기
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 | 남자 | 98 | NA | 88 | 64 | NA | NA | NA |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 312 | 78 | 합격 |
민수 | 1 | 남자 | 92 | 70 | NA | NA | NA | NA | NA |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 224 | 56 | 불합격 |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | NA | NA | NA |
여러 조건 중에서 선택적으로 값을 추가하기
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 | 남자 | 98 | NA | 88 | 64 | NA | NA | NA | F |
영희 | 2 | 여자 | 88 | 90 | 62 | 72 | 312 | 78 | 합격 | C |
민수 | 1 | 남자 | 92 | 70 | NA | NA | NA | NA | NA | F |
수현 | 3 | 여자 | 63 | 60 | 31 | 70 | 224 | 56 | 불합격 | F |
호영 | 4 | 남자 | 120 | 50 | NA | 88 | NA | NA | NA | F |
#07. 데이터 삭제
1) 행 삭제하기
데이터프레임이름[!(삭제조건), ]
형식으로 연산을 수행한 결과를 반환받는다.
느낌표와 콤마 주의
1
2
df <- 성적표[!(성적표$국어 > 100 ), ]
df
▶ 출력결과
A data.frame: 4 × 7
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
---|---|---|---|---|---|---|---|
<chr> | <int> | <chr> | <int> | <int> | <int> | <int> | |
1 | 철수 | 1 | 남자 | 98 | NA | 88 | 64 |
2 | 영희 | 2 | 여자 | 88 | 90 | 62 | 72 |
3 | 민수 | 1 | 남자 | 92 | 70 | NA | NA |
4 | 수현 | 3 | 여자 | 63 | 60 | 31 | 70 |
2) 열 삭제하기
컬럼 위치에 따른 삭제
삭제할 컬럼의 위치를 담는 백터에 대해 -
연산자 를 적용.
컬럼의 이름이 아닌 1부터 시작하는 인덱스 번호를 사용하여 삭제해야 한다.
1
2
df <- 성적표[ , -c(1, 2, 3)]
df
▶ 출력결과
A data.frame: 5 × 4
국어 | 영어 | 수학 | 과학 |
---|---|---|---|
<int> | <int> | <int> | <int> |
98 | NA | 88 | 64 |
88 | 90 | 62 | 72 |
92 | 70 | NA | NA |
63 | 60 | 31 | 70 |
120 | 50 | NA | 88 |
컬럼 이름에 의한 삭제
names(데이터프레임)
에 의해 컬럼의 이름을 반환받아 이 중에서 삭제 대상을 의미하는 벡터와 겹치지 않는 것들만 추려낸다.
엄밀히 말하면 삭제는 아니고, 지정한 조건에 맞지 않는 것들만 추려내는 형태.
1
2
3
drop_target = c('학년', '성별')
df <- 성적표[ , !(names(성적표) %in% drop_target)]
df
▶ 출력결과
A data.frame: 5 × 5
이름 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|
<chr> | <int> | <int> | <int> | <int> |
철수 | 98 | NA | 88 | 64 |
영희 | 88 | 90 | 62 | 72 |
민수 | 92 | 70 | NA | NA |
수현 | 63 | 60 | 31 | 70 |
호영 | 120 | 50 | NA | 88 |
#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> |
영희 | 88 | 90 | 62 | 72 |
민수 | 92 | 70 | NA | NA |
수현 | 63 | 60 | 31 | 70 |
왼쪽 데이터를 기준으로 결합하기
왼쪽에 지정된 데이터프레임(학생정보)에 대한 전체 데이터를 유지하고, 오른쪽 데이터(성적)에서 이름 열을 기준으로 매칭되는 데이터들을 찾아 결합한다.
기준열간의 데이터가 동일하지 않으면 경고메시지가 표시된다. (무시)
1
left_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과
A data.frame: 3 × 7
학생 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <dbl> | <fct> | <dbl> | <dbl> | <dbl> | <dbl> |
철수 | 1 | 남자 | NA | NA | NA | NA |
영희 | 1 | 여자 | 88 | 90 | 62 | 72 |
호영 | 3 | 남자 | NA | NA | NA | NA |
오른쪽 데이터를 기준으로 결합하기
1
right_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과
A data.frame: 3 × 7
학생 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <dbl> | <fct> | <dbl> | <dbl> | <dbl> | <dbl> |
영희 | 1 | 여자 | 88 | 90 | 62 | 72 |
민수 | NA | NA | 92 | 70 | NA | NA |
수현 | NA | NA | 63 | 60 | 31 | 70 |
전체 데이터 결합하기
1
full_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과
A data.frame: 5 × 7
학생 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <dbl> | <fct> | <dbl> | <dbl> | <dbl> | <dbl> |
철수 | 1 | 남자 | NA | NA | NA | NA |
영희 | 1 | 여자 | 88 | 90 | 62 | 72 |
호영 | 3 | 남자 | NA | NA | NA | NA |
민수 | NA | NA | 92 | 70 | NA | NA |
수현 | NA | NA | 63 | 60 | 31 | 70 |
기준열의 데이터가 매칭되는 것만 결합하기
양쪽에서 기준열의 값이 공통적으로 존재하는 행만 결합
1
inner_join(학생정보, 성적, by=c("학생" = "이름"))
▶ 출력결과
A data.frame: 1 × 7
학생 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <dbl> | <fct> | <dbl> | <dbl> | <dbl> | <dbl> |
영희 | 1 | 여자 | 88 | 90 | 62 | 72 |
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 | 남자 | 98 | NA | 88 |
영희 | 1 | 여자 | 88 | 90 | 62 |
민수 | 2 | 남자 | 92 | 70 | NA |
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 | 남자 | 98 | NA | 64 |
수현 | 2 | 여자 | 63 | 60 | 70 |
호영 | 3 | 남자 | 120 | 50 | 88 |
행 단위로 데이터 결합하기
양쪽의 DataFrmae에서 중첩되지 않는 열은 결측치(NA)로 처리되어 병합된다.
단순한 병합처리이기 때문에 데이터의 중복 여부는 검사하지 않는다.
1
bind_rows(성적표1, 성적표2)
▶ 출력결과
A data.frame: 6 × 7
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 |
---|---|---|---|---|---|---|
<chr> | <dbl> | <fct> | <dbl> | <dbl> | <dbl> | <dbl> |
철수 | 1 | 남자 | 98 | NA | 88 | NA |
영희 | 1 | 여자 | 88 | 90 | 62 | NA |
민수 | 2 | 남자 | 92 | 70 | NA | NA |
철수 | 1 | 남자 | 98 | NA | NA | 64 |
수현 | 2 | 여자 | 63 | 60 | NA | 70 |
호영 | 3 | 남자 | 120 | 50 | NA | 88 |
ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪Rdata 데이터전처리≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.