천선생의 삶
[R] 데이터 유형에 따른 정리(5) - dataframe 본문
안녕하세요. 천선생입니다.
이번 포스트에서는 데이터의 꽃, 데이터프레임 (dataframe)에 대해 알아보도록 하겠습니다.
이전가지의 포스트에서 다룬 데이터 유형들 역시 분석을 함에 있어서 반드시 필요한 요소이지만,
실제 우리가 '데이터' 를 받아보았을 때엔, 대부분 dataframe 의 형태로 받아오게 됩니다.
그렇다면, dataframe 이란 무엇일지 이제부터 알아보도록 하겠습니다!
- DATAFRAME?
간단하게 생각해 보았을 때, dataframe은 matrix의 형태를 유지하지만, list의 접근성을 갖습니다.
지난 포스트에서 list를 서랍장에 비유했던 것 기억나시나요? 이처럼 각 column (즉, 변수)로의 접근이 가능하게 됩니다.
이렇게 보면 와닿지 않을 수 있으니, 코드와 함께 설명해드리도록 하겠습니다.
- CODE
데이터프레임을 저장할 때는, dataframe 이라는 함수를 사용합니다.
함수 내부에서 각 column을 벡터형태로 입력하며, 형태에 한하여 독립적인데요.
이는 matrix 의 사각형 형태를 유지하면서, list 의 데이터 유형에 구애받지 않는 장점을 합친 것입니다!
#데이터프레임 저장 예
std_id <- 1:5
std_name <- c('김철수', '이영희', '최민영', '박민기', '조인영')
std_sex <- factor(c('M', 'F', 'M', 'M', 'F'), levels = c('M', 'F'))
#factor의 형태는 '범주형 데이터'를 의미한다. 이에 대한 추가설명은 이후에 다루도록 한다.
std_kor <- c(40, 90, 80, 50, 70)
std_eng <- c(70, 65, 77, 65, 50)
std_math <- c(50, 78, 98, 27, 45)
data_std <- data.frame(번호 = std_id,
이름 = std_name,
성별 = std_sex,
국어 = std_kor,
영어 = std_eng,
수학 = std_math)
# 번호 이름 성별 국어 영어 수학
# 1 1 김철수 M 40 70 50
# 2 2 이영희 F 90 65 78
# 3 3 최민영 M 80 77 98
# 4 4 박민기 M 50 65 27
# 5 5 조인영 F 70 50 45
#데이터프레임 구조확인
str(data_std)
# 'data.frame': 5 obs. of 6 variables:
# $ 번호: int 1 2 3 4 5
# $ 이름: Factor w/ 5 levels "김철수","박민기",..: 1 3 5 2 4
# $ 성별: Factor w/ 2 levels "M","F": 1 2 1 1 2
# $ 국어: num 40 90 80 50 70
# $ 영어: num 70 65 77 65 50
# $ 수학: num 50 78 98 27 45
이러한 형태는 DBMS의 테이블 구조와 매우 유사하고, 이로인해 접근성이 좋기에 가장 많이 사용합니다.
또한 str 함수를 활용하여 함수의 구조를 확인할 수 있는데,
data_std 데이터의 구조를 확인하면 이름 변수가 Factor 로 저장된 것을 확인하실 수 있습니다.
R은 분석용 툴로 개발되었기 때문에, character로 저장된 변수 역시 자동으로 Factor (범주형)으로 인식하기 때문입니다!
- INDEXING?
데이터프레임에서, 리스트처럼 각 변수별로 쉽게 접근할 수 있다는 점은 강력한 장점으로 작용합니다.
#인덱싱 예
std_id <- 1:5
std_name <- c('김철수', '이영희', '최민영', '박민기', '조인영')
std_sex <- factor(c('M', 'F', 'M', 'M', 'F'), levels = c('M', 'F'))
std_kor <- c(40, 90, 80, 50, 70)
std_eng <- c(70, 65, 77, 65, 50)
std_math <- c(50, 78, 98, 27, 45)
data_std <- data.frame(id = std_id,
name = std_name,
sex = std_sex,
kor = std_kor,
eng = std_eng,
math = std_math)
#변수명을 영어로 하는 이유? : 오류를 줄이기 위해서!
#리스트처럼 불러오기(1) : 가장 흔하게 사용
data_std$name
#리스트처럼 불러오기(2) : 문자값을 사용하여 column을 불러오는 방법
data_std[['name']]
#매트릭스처럼 불러오기
data_std[, 2]
data_std[3, ] #각 행값을 불러오는 방법도 존재
data_std[3, 'kor'] #행번호 + column name으로도 접근이 가능
위와 같이 다양한 형태로 접근이 가능하기 때문에, 데이터프레임에서의 indexing 은 굉장히 중요합니다!!
이때 주의하셔야 할 점은 data_std$name 등으로 불러낸 하나의 column값은, vector의 형태를 갖는다는 것입니다!
이를 통해 데이터프레임을 간단히 이해한다면,
1. 각 변수에 해당하는 vector를 column으로 갖습니다.
2. 각 관측치에 해당하는 (1 * p) dataframe을 row로 갖습니다. (p : 변수의 수)
- 활용
대표적인 예제 데이터인 iris 데이터를 활용하여 간단한 데이터프레임 조작법을 알아보도록 하겠습니다.
R에 기본적으로 내장되어 있어 바로 호출이 가능하지만,
read.csv 함수를 연습해보기 위하여 직접 저장한 데이터를 첨부해 드리겠습니다!
#데이터 불러오기 및 데이터프레임 조작 예제
#Working directory (데이터가 위치한 폴더) 설정
setwd('C:\\')
#read.csv를 활용하여 로컬폴더에 존재하는 데이터를 저장한다.
data <- read.csv('iris.csv')
str(data)
# 'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
#150 * 5 데이터임을 확인했다.
#새로운 변수를 입력한다. 이때 벡터의 길이는 데이터프레임의 행 수와 일치해야 올바르게 입력된다.
data$new_var <- 150:1
#데이터일부만 위에서 읽어온다. 기본값은 6행까지만 load!
head(data)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species new_var
# 1 5.1 3.5 1.4 0.2 setosa 150
# 2 4.9 3.0 1.4 0.2 setosa 149
# 3 4.7 3.2 1.3 0.2 setosa 148
# 4 4.6 3.1 1.5 0.2 setosa 147
# 5 5.0 3.6 1.4 0.2 setosa 146
# 6 5.4 3.9 1.7 0.4 setosa 145
#일부 변수만 추출, 이때 변수의 순서도 변경가능하다.
head(data[, c(5, 4, 3)])
# Species Petal.Width Petal.Length
# 1 setosa 0.2 1.4
# 2 setosa 0.2 1.4
# 3 setosa 0.2 1.3
# 4 setosa 0.2 1.5
# 5 setosa 0.2 1.4
# 6 setosa 0.4 1.7
'Data Analysis > R Basic' 카테고리의 다른 글
[R] 반복문 활용하기 - for, while (0) | 2019.07.11 |
---|---|
[R] 조건문 활용하기 - if, else, if else (0) | 2019.07.10 |
[R] 데이터 유형에 따른 정리(4) - list (0) | 2019.07.08 |
[R] 데이터 유형에 따른 정리(3) - array (0) | 2019.07.07 |
[R] 데이터 유형에 따른 정리(2) - matrix (0) | 2019.07.06 |