Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

천선생의 삶

[R] 데이터 유형에 따른 정리(5) - dataframe 본문

Data Analysis/R Basic

[R] 데이터 유형에 따른 정리(5) - dataframe

천선생 2019. 7. 9. 12:00

안녕하세요. 천선생입니다.

 

 이번 포스트에서는 데이터의 꽃, 데이터프레임 (dataframe)에 대해 알아보도록 하겠습니다.

이전가지의 포스트에서 다룬 데이터 유형들 역시 분석을 함에 있어서 반드시 필요한 요소이지만,

실제 우리가 '데이터' 를 받아보았을 때엔, 대부분  dataframe 의 형태로 받아오게 됩니다.

그렇다면, dataframe 이란 무엇일지 이제부터 알아보도록 하겠습니다!

 

- DATAFRAME?

 간단하게 생각해 보았을 때, dataframematrix의 형태를 유지하지만, 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 함수를 연습해보기 위하여 직접 저장한 데이터를 첨부해 드리겠습니다!

iris.csv
0.00MB

#데이터 불러오기 및 데이터프레임 조작 예제

#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

 

Comments