쭈쌤
쭈쌤 Hello World

[R 데이터분석] 데이터 프레임

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

[R 데이터분석] 데이터 프레임

데이터프레임(DataFrame)은 행과 열로 구성된 사각형의 표 형식의 자료구조 로서 데이터 분석에서 가장 유용하며 필수불가결한 자료형입니다. 데이터프레임이라는 용어가 낯설다면 엑셀과 같은 분석 프로그램의 시트(sheet) 데이터를 구현하기 위한 자료형이라고 생각하면 이해하기 쉽습니다.

  • 엑셀의 표 형태로 구성된 데이터분석의 가장 기본적인 자료구조
  • 으로 구성된다.
    • : column이나 변수라고도 부름
    • : row나 index라고도 부름
  • 열 > 행 순으로 값에 접근한다.

#01. 데이터프레임과 행렬

1) 공통점

데이터프레임과 행렬은 모두 2차원 데이터이다.

2) 차이점

  • 데이터프레임의 각 열은 서로 다른 자료형이 될 수 있다.
  • 데이터프레임은 열 이름, 행 이름을 가질 수 있다.

#02. 데이터프레임 생성하기

  1. 벡터를 통한 생성
  2. 텍스트 파일을 통한 생성
  3. csv파일 로드하기
  4. 엑셀파일 로드하기

1) 벡터를 활용한 생성

data.frame()함수에 여러 개의 벡터를 설정한 결과를 반환받는다.

a) 열로만 구성되는 데이터 프레임 생성

1
2
3
4
5
6
7
kor <- c(98, 88, 92, 63, 120)
eng <- c(NA, 90, 70, 60, 50)
math <- c(88, 62, NA, 31, NA)
sinc <- c(64, 72, NA, 70, 88)

성적표 <- data.frame(kor, eng, math, sinc)
성적표
▶ 출력결과
A data.frame: 5 × 4
korengmathsinc
<dbl><dbl><dbl><dbl>
98NA8864
88906272
9270NANA
63603170
12050NA88

b) 각 행과 열에 대한 이름 지정하기

열 이름 지정하기
  • data.frame()함수에 설정되는 각각의 벡터를 이름=벡터 형식으로 명시한다.
  • 데이터 분석에서 열을 의미하는 용어들: 컬럼(column), 변수(value)
행 이름 지정하기
  • data.frame()함수에 row.names 파라미터를 지정하고, 각 행의 이름을 벡터로 설정한다.
  • 데이터 분석에서 행을 의미하는 용어들: 인덱스(index), 로우(row)
  • Python에서는 데이터프레임에 대한 인덱스가 정해져 있는 것이 분석에 유리하지만 R에서는 인덱스를 사용하지 않는 것이 더 유리하다.
1
2
3
4
5
6
성적표 <- data.frame(국어=kor,
                     영어=eng,
                     수학=math,
                     과학=sinc,
                     row.names=c("철수", "영희", "민수", "수현", "호영"))
성적표
▶ 출력결과
A data.frame: 5 × 4
국어영어수학과학
<dbl><dbl><dbl><dbl>
철수 98NA8864
영희 88906272
민수 9270NANA
수현 63603170
호영12050NA88

파이썬의 경우 데이터프레임의 인덱스가 그래프에서의 x축에 대한 텍스트 라벨로 사용되지만 R의 경우 데이터프레임의 인덱스는 활용도가 매우 낮기 때문에 가급적 사용하지 않는 것이 분석 결과 생성에 더 유리하다.

2) 텍스트 파일 가져오기

각 컬럼이 탭키로 구분되는 형식

1
2
3
4
5
6
7
8
read.table(file,                 # 가져올 파일의 경로 혹은 URL (필수)
           header = TRUE|FALSE,  # 첫 번째 행을 헤더로 사용할 것인지 여부 (기본값=FALSE)
           sep = ""              # 각 열을 구분하는 글자 (필수)
           row.names = c(...),   # 행 이름 설정. 데이터를 불러온 후 지정하는게 좋음
           col.names = c(...),   # 열 이름 설정. 데이터를 불러온 후 지정하는게 좋음
           na.strings = "NA",    # NA 처리를 하고자 하는 문자열 지정
           stringsAsFactors = default.stringsAsFactors(), # 문자열 컬럼의 팩터화 여부
           fileEncoding = "utf-8|euc-kr")  # 파일 인코딩 (Mac을 사용할 경우 필수)

a) 기본값들로만 처리하는 경우

텍스트 파일의 첫 행이 데이터로 인식되고 각 컬럼의 이름은 임의로 지정된다.

빈 값도 하나의 데이터로 인식된다.

1
2
성적표txt <- read.table("http://itpaper.co.kr/demo/r/grade.txt", sep='\t', fileEncoding="euc-kr")
성적표txt
▶ 출력결과
A data.frame: 6 × 7
V1V2V3V4V5V6V7
<fct><fct><fct><fct><fct><fct><fct>
이름학년성별국어영어수학과학
철수1 남자98 88 64
영희2 여자88 90 62 72
민수1 남자92 70
수현3 여자63 60 31 70
호영4 남자120 50 88

b) 주요 옵션을 함께 지정 (권장)

  • header=TRUE : 텍스트 파일의 첫 번째 라인을 컬럼 이름으로 사용
  • na.strings=”“ : 빈 칸을 결측값(NA)으로 인식
1
2
성적표txt <- read.table("http://itpaper.co.kr/demo/r/grade.txt", sep='\t', header=TRUE, na.strings="", fileEncoding="euc-kr")
성적표txt
▶ 출력결과
A data.frame: 5 × 7
이름학년성별국어영어수학과학
<fct><int><fct><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

3) csv 파일 읽기

read.table() 함수에서 sep 옵션이 콤마(,)로 기본 지정되어 있으며 header 옵션의 기본값이 TRUE로 지정되어 있다.

1
2
3
4
5
6
7
8
read.csv(file,                 # 가져올 파일의 경로 혹은 URL (필수)
         header = TRUE|FALSE,  # 첫 번째 행을 헤더로 사용할 것인지 여부 (기본값=TRUE)
         sep = ","             # 각 열을 구분하는 글자 (기본값=콤마',')
         row.names = c(...),   # 행 이름 설정. 데이터를 불러온 후 지정하는게 좋음
         col.names = c(...),   # 열 이름 설정. 데이터를 불러온 후 지정하는게 좋음
         na.strings = "NA",    # NA 처리를 하고자 하는 문자열 지정
         stringsAsFactors = default.stringsAsFactors(), # 문자열 컬럼의 팩터화 여부
         fileEncoding="utf-8|euc-kr")  # 파일 인코딩 (Mac을 사용할 경우 필수)
1
2
3
4
# csv 파일 가져오기
# -> header=F 옵션을 추가하면 첫 줄이 컬럼이름으로 인식되지 않고 일반 데이터로 인식된다.
성적표csv <- read.csv("http://itpaper.co.kr/demo/r/grade.csv", stringsAsFactors=F, fileEncoding="euc-kr")
성적표csv
▶ 출력결과
A data.frame: 5 × 7
이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

4) 엑셀파일 가져오기

a) 엑셀파일을 처리하기 위한 패키지 설치 및 로드

1
2
3
REPO_URL <- "https://cran.seoul.go.kr/"
if (!require(readxl)) install.packages("readxl", repos=REPO_URL)
library(readxl)

b) 엑셀파일 가져오기

특별한 처리를 하지 않는 이상 텍스트나 csv와 달리 현재 컴퓨터에 저장되어 있는 파일만 가져올 수 있다.

1
2
3
4
read_excel(file,             # 엑셀파일의 경로 (필수)
           sheet="...",      # 읽어올 시트의 이름 (필수)
           range = "...",    # 읽어들일 범위 (ex: A1:D19)
           col_names = TRUE) # 엑셀의 첫 행을 컬럼이름으로 사용할지 여부(기본값=True)

원격지의 엑셀 파일을 가져와야 하는 경우 download.file(URL, 저장할파일이름, mode='wb') 함수를 사용하여 파일을 내려받은 후 읽어들일 수 있다.

mode=’wb’가 지정되지 않을 경우 다운받은 파일을 압축 파일로 인식한다.

1
2
3
4
filename <- 'helloworld.xlsx'
download.file("http://itpaper.co.kr/demo/r/grade.xlsx", filename, mode='wb')
성적표xlsx <- read_excel(filename, sheet="grade")
성적표xlsx
▶ 출력결과
A tibble: 5 × 7
이름학년성별국어영어수학과학
<chr><dbl><chr><dbl><dbl><dbl><dbl>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

#03. 데이터에 접근하기

1) 데이터의 개요 확인

a) 각 열의 이름 확인

1
2
컬럼이름 <- names(성적표xlsx)
컬럼이름
▶ 출력결과
1
2
3
4
5
6
7
1. '이름'
2. '학년'
3. '성별'
4. '국어'
5. '영어'
6. '수학'
7. '과학'

b) 데이터의 크기 확인 (행,열의 수 구하기)

1
2
크기 <- dim(성적표xlsx)
크기
▶ 출력결과
1
2
1. 5
2. 7

c) 상위 3건 확인하기

두 번째 파라미터를 생략할 경우 6건을 기본으로 가져온다.

1
2
상위데이터 <- head(성적표xlsx, 3)
상위데이터
▶ 출력결과
A tibble: 3 × 7
이름학년성별국어영어수학과학
<chr><dbl><chr><dbl><dbl><dbl><dbl>
철수1남자98NA8864
영희2여자88906272
민수1남자9270NANA

d) 하위 3건 확인하기

1
2
하위데이터 <- tail(성적표xlsx, 3)
하위데이터
▶ 출력결과
A tibble: 3 × 7
이름학년성별국어영어수학과학
<chr><dbl><chr><dbl><dbl><dbl><dbl>
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

1) 열 단위로 접근하기

데이터프레임이름$열이름

R 자체 기능으로서의 출력 기능

1
print(성적표xlsx$국어)
▶ 출력결과
1
[1]  98  88  92  63 120

jupyter에서의 출력 기능

1
성적표xlsx$국어
▶ 출력결과
1
2
3
4
5
1. 98
2. 88
3. 92
4. 63
5. 120

2) 행 단위로 접근하기

특정 행 하나만 가져오기

데이터프레임이름[‘인덱스이름’, ]

혹은

데이터프레임이름[인덱스번호, ]

이름 뒤에 콤마(,)주의. 인덱스번호는 1부터 시작하고 인덱스 이름은 문자열 형태로 지정한다.

1
성적표xlsx[1,]
▶ 출력결과
A tibble: 1 × 7
이름학년성별국어영어수학과학
<chr><dbl><chr><dbl><dbl><dbl><dbl>
철수1남자98NA8864

복수의 행을 가져오기

가져올 행 이름이나 인덱스 번호를 벡터로 구성한다.

1
성적표xlsx[c(1, 3),]
▶ 출력결과
A tibble: 2 × 7
이름학년성별국어영어수학과학
<chr><dbl><chr><dbl><dbl><dbl><dbl>
철수1남자98NA8864
민수1남자9270NANA

3) 행을 기준으로 열을 일부만 가져오기

철수행(1번)에서 이름,영어,수학열만 조회

1
성적표xlsx[1, c('이름', '영어', '수학')]
▶ 출력결과
A tibble: 1 × 3
이름영어수학
<chr><dbl><dbl>
철수NA88

4) 단일 값에 접근하기

데이터프레임이름[‘인덱스이름’, ‘컬럼이름’]

혹은

데이터프레임이름[인덱스번호, ‘컬럼이름’]

1
성적표xlsx[1, '국어']
▶ 출력결과
A tibble: 1 × 1
국어
<dbl>
98
Rating:

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

comments powered by Disqus