본문 바로가기
언어/R

[R-006] 데이터 프레임(Data Frame)

by 천왕지짐 2023. 4. 4.
데이터 프레임은 표 형태를 표현할 수 있도록 단순화시킨 일종의 리스트이며, 변수(필드)와 관찰치(레코드)로 구성된 2차원의 자료객체로서 자료 분석에 있어 가장 일반적인 자료 구조를 가지고 있다고 할 수 있다. 각 변수들은 서로 다른 자료형을 가질 수 있으나, 동일한 관찰치의 개수를 가져야 한다는 제약이 따른다. 일상에서 마주하는 표 자료들은 데이터프레임으로 표현하는 것이 가장 편리하다.

 

Excel Data를 사용하는 방법을 잠시 알아보자.

  - 아래 파일을 다운로드 하여 작업 폴더에 위치시킨다.

exam.xlsx
0.02MB

  -  install.packages("readxl")
  -  library(readxl)
  -  x = read_excel("exam.xlsx")
  -  View(x)

 

예를 들어, 4개의 관찰치를 가진 3개의 변수를 고려해 보자.

  변수1(age) 변수2(gender) 변수3(car)
관찰치1 21 '' False
관찰치2 22 '' True
관찰치3 31 '' True
관찰치4 40 '' False

 

1) 데이터프레임의 생성

 

데이터프레임은 일반적으로 data.frame() 함수를 사용하여 생성한다. 간단한 형식은 다음과 같다.

 

data.frame(길이가 같은 객체들)

 

다음 예를 보자. 성명(name)과 성별(gender) 그리고 수학(Math)과 영어(Eng) 성적을 기록한 표를 데이터프레임으로 작성하자.

 

실습 데이터 프레임 만들기

name =c('홍길동','이도령','성춘향','연흥부') #성분1 name
gender =c('','','','') #성분2 gender
Math =c(85, 70, 80, 92) #성분3 Math
Eng =c(80, 77, 85, 80) #성분4 Eng
X = data.frame(name, gender, Math, Eng) #데이터프레임 X 생성
X

name gender Math Eng #변수명을 디폴트 names로 사용함.

1 홍길동 남 85 80
2 이도령 남 70 77
3 성춘향 여 80 85
4 연흥부 남 92 80

str(X)
#데이터프레임 구조 확인

관찰치 번호는 데이터프레임을 생성할 때 특별히 정의하지 않으면 자동으로 1,2,3,으로 붙는다.

변수명이 곧 데이터프레임의 성분이름 names(X)가 된다.

X = data.frame(name, gender, Math, Eng, stringsAsFactors = TRUE)와의 차이에 대해 str()로 알아보자.

 

참고 [Factor는 범주형 데이터로 수로써 어떤 의미도 없고 나눠진 계급 중 하나에 속할 뿐이다.

 

실습 rbind 또는 cbind를 사용하지 않아도 dataframe이 만들어 진다. 실습해 보자.

vec1 <- c('one','two','three')
vec2 <- c(1,2,3)
a = rbind(vec1,vec2)
b = data.frame(rbind(vec1,vec2))

a와 b의 차이를 names(a), names(b)를 통해 생각해 보자.

 

 

실습 데이터 프레임 mode 확인

mode(X) #데이터프레임 X의 모드는 list 이다.
[1] "list"

dim(X) #
행과 열의 개수

[1] 4 4

length(X) #
변수의 개수

[1] 4

데이터 프레임의 모드는 list 이다.

dim() 함수는 데이터프레임의 행(관찰치)과 열(변수)의 개수를 출력한다.

  - nrow()와 ncol()로 행과 열의 개수를 확인할 수 있다.

length()는 데이터프레임의 변수의 개수를 출력한다.

 

2) 데이터프레임의 원소 참조 및 변경

 

데이터프레임의 일종의 리스트 객체이므로 자료에 대한 접근 방식은 리스트와 비슷하다. , $[[]]을 사용하여 원소에 접근한다. 다음 예를 보면서 데이터프레임의 자료에 대한 접근방법을 익혀보자.

 

다시한번 잠깐 생각해 보면 벡터는 같은 자료형식, 리스트는 다른 자료형식도 가능한 구조였다. 그런 의미에서 데이터프레임은 일종의 리스트 객체라고 보는 것 같다.

 

X$Eng, X$Eng[], Eng[ ], Eng 모두 리스트에 대한 처리로 동일한 결과를 나타낸다는 것을 이해하자.

X[ ]의 경우 데이터 프레임에 대한 처리로 콤마를 기준으로 숫자가 모두 있으면 원소를 숫자가 없으면 열이나 행전체를 의마한다.

 

원소 참조: 두 번째 관찰치의 이름은? 그리고 3 번째 관찰치의 영어 성적은?

 

실습 데이터 프레임의 원소 참조

> X$name[2]
[1] 이도령


> X$Eng[3]
[1] 85


> X[[3,1]]
[1] 성춘향

• 각 관찰치의 이름을 출력한다.

 

원소 치환: 이도령의 수학 성적 70점을 75점으로 바꾸어 보자.

 

실습 데이터 프레임의 원소 치환

X$Math[2]=75 #두 번째 관찰치의 Math75으로 치환
X[, c(1,3)] #X1, 3번째 열만 출력
name Math
1 홍길동 85
2 이도령 75
3 성춘향 80
4 연흥부 92

 

변수(필드) 제거: 다음은 데이터프레임 X에서 gender 필드를 제거해 보자.

 

실습 데이터 프레임의 필드 제거

> X=X[-2] # 두 번째 필드(gender) 제거
> X
name Math Eng
1 홍길동 85 80
2 이도령 75 77
3 성춘향 80 85
4 연흥부 92 80

 

변수(필드) 추가: 다음은 데이터프레임 X에서 과학(Sci) 필드를 추가해 보자.

 

실습 데이터 프레임의 필드 추가

> X$Sci=c(67, 75, 74, 79) # 데이터프레임 XSci 변수이름 및 관찰치 추가
> X
name Math Eng Sci
1 홍길동 85 80 67
2 이도령 70 77 75
3 성춘향 80 85 74
4 연흥부 92 80 79

기존 데이터프레임 X새로운 변수(필드)를 추가할 때는 단순히 X$새로운 변수 = 관찰치 자료 를 입력하면 된다.

 

연관 검색: 데이터프레임에서는 단순 검색 뿐 만 아니라 연관검색을 수행할 수 있다. 예를 들어 홍길동의 수학 점수라던가 수학점수가 70점을 초과한 학생의 영어성적 등등을 검색하는 방법을 알아보자.

 

실습 데이터 프레임의 검색

> X[X$name=='홍길동', ]$Math # X$name'홍길동'인 행의 Math
[1] 85


> X[X$Math>70,]$Eng
[1] 80 85 80 # X$Math70 이상인 행들의 Eng

- 우선

X$name=='홍길동

(TRUE, FALSE, FALSE, FALSE) 벡터를 생성한다. 그래서

X[X$name=='홍길동', ]

X의 첫 행의 모든 원소들이 되며, 따라서

X[X$name=='홍길동', ]$Math

X 첫 행의 수학 성적을 나타낸다.

 

- 비슷한 방법으로

X$Math>70

(TRUE, FALSE, TRUE, TRUE) 벡터를 생성하므로

X[X$Math>70, ]

X의 수학성적이 70 이상인 행들의 모든 원소들이 되며,

X[X$Math>70,]$Eng

X의 수학성적이 70 이상인 행들의 영어 성적을 나타낸다.

 

3) 데이터프레임의 기본정보 보기

 

head()tail()

 

데이터프레임의 첫 6행과 마지막 6행을 보는 함수이다. 데이터프레임의 행의 크기가 클 경우 사용하면 유용하다.

 

실습 head(), tail()실습

> head(Student, 3) #데이터프레임 Student의 첫 3
name gender Math Eng
1 홍길동 남 85 80
2 이도령 남 70 77
3 성춘향 여 80 85


> tail(Student, 2) #데이터프레임 Student의 마지막 2
name gender Math Eng
3 성춘향 여 80 85
4 연흥부 남 92 80

 

summary()

 

summary() 함수를 이용하면, 데이터프레임의 기초 통계를 살펴볼 수 있다.

 

실습 summary() 실습

> summary(Student)
name gender Math Eng
성춘향:1 :3 Min. :70.00 Min. :77.00
연흥부:1 :1 1st Qu.:77.50 1st Qu.:79.25
이도령:1 Median :82.50 Median :80.00
홍길동:1 Mean :81.75 Mean :80.50
3rd Qu.:86.75 3rd Qu.:81.25
Max. :92.00 Max. :85.00

 

각 변수별 기초 자료를 제공한다.

name 변수: 이름과 인원수를 알려주고 있다.

gender 변수: 성별과 인원수를 알려주고 있다.

Math, Eng 변수: 최소값과 최대값 그리고 평균 및 제1,2,3 분위수를 제공하고 있다.

 

str()

 

함수 str()은 데이터프레임 뿐만 아니라 모든 형태의 객체들의 구조를 간략히 설명해 주는 역할을 한다.

 

실습 str() 실습

> str(Student)
'data.frame': 4 obs. of 4 variables:
$ name : Factor w/ 4 levels "성춘향","연흥부",..: 4 3 1 2
$ gender: Factor w/ 2 levels "","": 1 1 2 1
$ Math : num 85 70 80 92
$ Eng : num 80 77 85 80

* stringsAsFactors = FALSE를 사용한 경우 위와 다를 수 있다.

 

출력된 결과를 간단히 설명하면 다음과 같다.

'data.frame': 4 obs. of 4 variables:

자료구조는 data.frame이며, 4개의 관측치와 4개의 변수로 이루어져 있다.

 

$ name : Factor w/ 4 levels "성춘향","연흥부",..: 4 3 1 2

소속 변수 name은 인자형 자료이고 4개의 수준을 가지며, 값들은 "성춘향","연흥부",.. 등등이며, 수준 값은 4 3 1 2 이다.

 

$ Eng : num 80 77 85 80

소속 변수 Eng는 수치형 자료이고 값들은 80, 77, 85, 80 이다.

 

 

4) apply 함수 이용하기

 

data.frame에서 각 row, column에 대해 평균을 계산하거나 특정함수를 적용하고 싶을 때 사용하며 for loop를 활용한다.

 

실습 iris 데이터로 실습

> head(iris[c(1,2,3,4)])
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
5 5.0 3.6 1.4 0.2
6 5.4 3.9 1.7 0.4
> apply(iris,2,sum) # 이렇게 하면 에러가 발생된다.
> apply(iris[c(1,2,3,4)], 2, sum) # 벡터 스타일로 지정
Sepal.Length Sepal.Width Petal.Length Petal.Width
876.5 458.6 563.7 179.9
> apply(iris[,1:4], 2, sum) # 메트릭스 스타일로 지정, 결과는 동일하다.
Sepal.Length Sepal.Width Petal.Length Petal.Width
876.5 458.6 563.7 179.9

 

학생의 성적으로 평균을 구해 보자. 소수점 이하의 자릿수 지정은 round함수를 사용한다.

 

실습 종합 실습

> Student=data.frame(name =c('홍길동','이도령','성춘향','연흥부'),
gender =c('','','',''),
Math =c(85, 70, 80, 92),
Eng =c(80, 77, 85, 80) )
> Student
name gender Math Eng
1 홍길동 남 85 80
2 이도령 남 70 77
3 성춘향 여 80 85
4 연흥부 남 92 80
> apply(Student[c(3,4)], 2, sum)
Math Eng
327 322
> apply(Student[c(3,4)], 2, mean)
Math Eng
81.75 80.50
> Student$Sum = apply(Student[c(3,4)], 1, sum)
> Student
name gender Math Eng Sum
1 홍길동 남 85 80 165
2 이도령 남 70 77 147
3 성춘향 여 80 85 165
4 연흥부 남 92 80 172
> Student$Mean = apply(Student[c(3,4)], 1, mean)
> Student
name gender Math Eng Sum Mean
1 홍길동 남 85 80 165 82.5
2 이도령 남 70 77 147 73.5
3 성춘향 여 80 85 165 82.5
4 연흥부 남 92 80 172 86.0

 

 

'언어 > R' 카테고리의 다른 글

[R-008] R패키지 - 데이터 핸들링(dplyr)  (0) 2023.04.15
[R-007] 외부 데이터 불러오기, 저장하기  (0) 2023.04.12
[R-005] 벡터(Vector) 2  (0) 2023.03.29
[R-004] R 기본 문법  (0) 2023.03.29
[R-003] 데이터 구조, 벡터 1  (0) 2023.03.29

댓글