새소식

강의 및 세미나 자료/R

R 핵심만 배우기 #3 - 데이터 프레임(data.frame) 첫번째

  • -
R 핵심만 배우기 #3 - 데이터 프레임(data.frame) 첫번째

(2017년 업데이트 하면서, R(3.4.2버전), R Notebook 으로 작성되었습니다.) > data.frame 다루기

data.frame에 대해 알아봅시다

데이터 프레임은 R의 핵심적인 자료구조로서,

쉽게 말해 엑셀과 같이 숫자, 문자 등 다양한 데이터를 하나의 테이블에 담을 수 있는 자료구조입니다.

이를 잘 활용하면 엑셀의 기능들을 R에서도 자유자제로 사용할 수 있습니다.


먼저 데이터 데이터 프레임을 생성하는 방법은 다음과 같습니다.

df <- data.frame(col1=c('a','b','c','d','e') , col2=c(2, 4, 6, 8, 10))
df
##   col1 col2
## 1    a    2
## 2    b    4
## 3    c    6
## 4    d    8
## 5    e   10

생성한 데이터 프레임의 구조는 아래와 같이 파악할 수 있습니다.

#dataframe의 구조(structure) 파악하기
?str()
head(df)
##   col1 col2
## 1    a    2
## 2    b    4
## 3    c    6
## 4    d    8
## 5    e   10
str(df)
## 'data.frame':    5 obs. of  2 variables:
##  $ col1: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
##  $ col2: num  2 4 6 8 10
summary(df)
##  col1       col2   
##  a:1   Min.   : 2  
##  b:1   1st Qu.: 4  
##  c:1   Median : 6  
##  d:1   Mean   : 6  
##  e:1   3rd Qu.: 8  
##        Max.   :10
#R에 기본 내장되어 있는 iris 데이터셋을 이용해 보면,
str(iris)
## '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 ...
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
  • data.frame의 row, column 접근하기
df <- data.frame(col1=c('a','b','c','d','e') , col2=c(2, 4, 6, 8, 10))
df$col1 #column이름으로 접근하기
## [1] a b c d e
## Levels: a b c d e
df[1,] #첫번째 row의 모든 column
##   col1 col2
## 1    a    2
df[,2] #2번째 column의 모든 row
## [1]  2  4  6  8 10
  • column 추가하기
df <- data.frame(col1=c('a','b','c','d','e') , col2=c(2, 4, 6, 8, 10))
df$col3 <- c(1,2,3,4,5)
df
##   col1 col2 col3
## 1    a    2    1
## 2    b    4    2
## 3    c    6    3
## 4    d    8    4
## 5    e   10    5

Quiz

R에 기본 내장되어 있는 iris 데이터를 활용하여 아래 질문에 답하시오.

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
  • 첫번째, 3번째 column을 선택하시오
##   Sepal.Length Petal.Length
## 1          5.1          1.4
## 2          4.9          1.4
## 3          4.7          1.3
## 4          4.6          1.5
## 5          5.0          1.4
## 6          5.4          1.7
  • 3번째 column을 제거하시오
##   Sepal.Length Sepal.Width Petal.Width Species
## 1          5.1         3.5         0.2  setosa
## 2          4.9         3.0         0.2  setosa
## 3          4.7         3.2         0.2  setosa
## 4          4.6         3.1         0.2  setosa
## 5          5.0         3.6         0.2  setosa
## 6          5.4         3.9         0.4  setosa
  • 각 row의 Sepal.Length와 Sepal.Width의 값을 더하여 Sepal.Sum이라는 column을 추가하세요
##   Sepal.Length Sepal.Width Petal.Width Species Sepal.Sum
## 1          5.1         3.5         0.2  setosa       8.6
## 2          4.9         3.0         0.2  setosa       7.9
## 3          4.7         3.2         0.2  setosa       7.9
## 4          4.6         3.1         0.2  setosa       7.7
## 5          5.0         3.6         0.2  setosa       8.6
## 6          5.4         3.9         0.4  setosa       9.3

** 참고) df[1,] 과 df[1, ,drop=T]의 차이는?

class(df[1,])
## [1] "data.frame"
class(df[1, ,drop=T])
## [1] "list"

dataframe 이름 바꾸기

df <- data.frame(a=1:3,b=4:6,c=7:9)
colnames(df) <- c('열1','열2','열3')
rownames(df) <- c('행1','행2','행3')

타입변환에 대해 알아봅시다

  • 데이터 타입’만’ 알고 싶을때 : class 함수
class(c(1,2))
## [1] "numeric"
class(matrix(c(1,2)))
## [1] "matrix"
class(list(1,2))
## [1] "list"
class(data.frame(1,2))
## [1] "data.frame"
  • 데이터 타입과 데이터 모양에 대한 추가정보까지 : str 함수
str(c(1,2))
##  num [1:2] 1 2
str(matrix(c(1,2)))
##  num [1:2, 1] 1 2
str(list(c(1,2)))
## List of 1
##  $ : num [1:2] 1 2
str(data.frame(1,2))
## 'data.frame':    1 obs. of  2 variables:
##  $ X1: num 1
##  $ X2: num 2
  • 데이터 타입을 맞는지 틀린지 TRUE/FALSE를 반환하는 함수
is.numeric(c(1,2,3))
## [1] TRUE
is.numeric(c('a','b','c'))
## [1] FALSE
is.matrix(matrix(c(1,2)))
## [1] TRUE

자료 구조간의 변환 방법

#list를 vector로
lst <- list(1,2,3,4)
unlist(lst)
## [1] 1 2 3 4
#list를 dataframe으로
lst <- list(x=c(1,2),y=c(3,4))
data.frame(lst)
##   x y
## 1 1 3
## 2 2 4
#matrix를 데이터 프레임으로
mat <- matrix(c(1,2,3,4), ncol=2)
data.frame(mat)
##   X1 X2
## 1  1  3
## 2  2  4
#벡터를 factor로, factor를 벡터로
x <- c("m","f")
as.factor(x) #문자열을 Factor로
## [1] m f
## Levels: f m
as.numeric(as.factor(x)) #Factor를 다시 숫자형으로
## [1] 2 1

Quiz

  1. 남, 여를 1,2 로 바꿔보자
vec <- c('남','여','남','남','여')
## [1] 1 2 1 1 2
  • 참고 : 남, 여를 2,1 로 바꾸면?
as.numeric(factor(vec, levels=c('여','남')))
## [1] 2 1 2 2 1

실습 과제

첨부한 파일을 다운 받고 R에서 불러오세요.

toyota_sample.csv


data_csv <- read.csv('toyota_sample.csv')
head(data_csv)
str(data_csv)
  1. data_csv의 Price의 평균을 계산하여라

  2. data_csv의 Age 의 표준편차을 계산하여라

  3. data_csv의 3~5번째 row 선택하세요


Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.