R 기본 문법

  • R은 인터프리터 언어 (컴파일방식 ex.C언어)
  • 대소문자 구분
  • # : 주석
  • > : 명령 프롬프트
  • + : 여러줄에 명령을 칠때 다음줄의 가장 왼쪽에 생성됨
# 주석을 이렇게 작성 가능함

# 멀티 주석도 가능함 RStudio에서 전체 선택 후
# Ctrl+Shift+C로 가능함

#변수 생성
firstData01 <- c(1:5)

R 기본 Operators

Math Operators

  • + : 더하기
  • - : 빼기
  • * : 곱하기
  • / : 나누기
  • %% : 나머지
  • ^.** : 승수
#더하기 빼기 예제
10+22
## [1] 32
32-9
## [1] 23
9+(32-7)
## [1] 34
#곱하기 & 나누기
55*8
## [1] 440
55/8
## [1] 6.875
#나머지
88%%7
## [1] 4
#제곱
3^3
## [1] 27

Logical Operators

  • < : 적다
  • <= : 적거나 같다
  • > : 크다
  • >= : 크거나 같다
  • == : 같다
  • != : 같지 않다
  • !x : x가 아닌
  • x | y : x 또는 y
  • x & y : x 또한 y
  • isTRUE(x) : x가 참이라면

R 데이터 구조

데이터 형태

  • 문자형 : 문자 처리할때는 쌍따움표(“”)나 홑따옴표(’’)를 사용해야함
  • Boolean : 데이터들을 비교하여 참일경우 true, 거짓일 경우 fale 반환
  • NA : (Not Applicable 또는 Not Available)로 정해진 범위 안에 있는 값이 아니라서 사용할수 없는 경우
  • NULL : 값이 정해지지 않아서 얼마인지 모르는 경우
  • Factor : 여러번 중복으로 나오는 데이터들을 각 값으로 모아서 대표값을 출렴한 형태
  • 날짜와 시간 : 날짜 형태 Sys.Date(), Sys.time(), Date(), as.Date()
#날짜와 시간
Sys.Date()
## [1] "2016-04-25"
Sys.time()
## [1] "2016-04-25 01:24:40 KST"
date()
## [1] "Mon Apr 25 01:24:40 2016"
as.Date(Sys.Date()-3,"%Y%m%d")  #지정한 데이터 변경 가능함
## [1] "2016-04-22"

 

데이터 타입

  • 벡터 (Vector)
  • 행렬 (Matrix)
  • 리스트 (List)
  • 데이터프레임 (DataFrame)
# 벡터
inStr01<-9
inStr02<-9:13
inStr02<-c(inStr02,900:902)
inStr03<-seq(1, 9, by = 2)
inStr02
## [1]   9  10  11  12  13 900 901 902
# 벡터 + Factors
gender<-c("남자","여자","여자","남자","여자")
gender<-factor(gender)
gender
## [1] 남자 여자 여자 남자 여자
## Levels: 남자 여자
# DataFrame 우리가 가장 많이 다룰 데이터 타입
inData01<-data.frame(iris)
str(inData01)
## '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 ...

Data Frame

가장 많이 활용한다고 하는 이 구조에 대해서 보다 상세히 알아 보고 넘어가자
해당 타입은 Excel의 Sheet와 유사한 구조이며, 각 Column은 다른 구조를 가질수 있다

# DataFrame 4행 조회
inData01[4,]
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 4          4.6         3.1          1.5         0.2  setosa
# DataFrame 3열 조회
inData01[,3]
##   [1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 1.6 1.4 1.1 1.2 1.5 1.3
##  [18] 1.4 1.7 1.5 1.7 1.5 1.0 1.7 1.9 1.6 1.6 1.5 1.4 1.6 1.6 1.5 1.5 1.4
##  [35] 1.5 1.2 1.3 1.4 1.3 1.5 1.3 1.3 1.3 1.6 1.9 1.4 1.6 1.4 1.5 1.4 4.7
##  [52] 4.5 4.9 4.0 4.6 4.5 4.7 3.3 4.6 3.9 3.5 4.2 4.0 4.7 3.6 4.4 4.5 4.1
##  [69] 4.5 3.9 4.8 4.0 4.9 4.7 4.3 4.4 4.8 5.0 4.5 3.5 3.8 3.7 3.9 5.1 4.5
##  [86] 4.5 4.7 4.4 4.1 4.0 4.4 4.6 4.0 3.3 4.2 4.2 4.2 4.3 3.0 4.1 6.0 5.1
## [103] 5.9 5.6 5.8 6.6 4.5 6.3 5.8 6.1 5.1 5.3 5.5 5.0 5.1 5.3 5.5 6.7 6.9
## [120] 5.0 5.7 4.9 6.7 4.9 5.7 6.0 4.8 4.9 5.6 5.8 6.1 6.4 5.6 5.1 5.6 6.1
## [137] 5.6 5.5 4.8 5.4 5.6 5.1 5.1 5.9 5.7 5.2 5.0 5.2 5.4 5.1

 

데이터 조회

특정행을 몇개 조회함 (5개)

inData01[1:5,]
##   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

특정행에 대해서 값이 일치하는 행을 조회함

#Head()는 데이터 건수가 많아서 상위 몇개만 조회 목적으로 사용함
head(inData01[inData01$Species=="setosa",])
##   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

특정행에 조건에 대해서 맞으면 조회함

inData01[which(inData01$Species=="setosa" & inData01$Petal.Width > 0.3),]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 6           5.4         3.9          1.7         0.4  setosa
## 16          5.7         4.4          1.5         0.4  setosa
## 17          5.4         3.9          1.3         0.4  setosa
## 22          5.1         3.7          1.5         0.4  setosa
## 24          5.1         3.3          1.7         0.5  setosa
## 27          5.0         3.4          1.6         0.4  setosa
## 32          5.4         3.4          1.5         0.4  setosa
## 44          5.0         3.5          1.6         0.6  setosa
## 45          5.1         3.8          1.9         0.4  setosa

Subset 데이터 조회 Function 사용 Syntax : subset([Data], 조건, select=c([Output]))

subset(inData01, Species=="setosa" & Petal.Width > 0.3, select=c(Sepal.Length:Species))
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 6           5.4         3.9          1.7         0.4  setosa
## 16          5.7         4.4          1.5         0.4  setosa
## 17          5.4         3.9          1.3         0.4  setosa
## 22          5.1         3.7          1.5         0.4  setosa
## 24          5.1         3.3          1.7         0.5  setosa
## 27          5.0         3.4          1.6         0.4  setosa
## 32          5.4         3.4          1.5         0.4  setosa
## 44          5.0         3.5          1.6         0.6  setosa
## 45          5.1         3.8          1.9         0.4  setosa

램덤 데이터 조회

inData01[sample(1:nrow(inData01), 3, replace = FALSE),]
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 128          6.1         3.0          4.9         1.8 virginica
## 120          6.0         2.2          5.0         1.5 virginica
## 140          6.9         3.1          5.4         2.1 virginica

 

데이터 품질

데이터 품질관리로 결측치에 대한 값 처리에 대해서는 아래와 같이 처리함

y <- c(1,2,3,NA)
is.na(y)
## [1] FALSE FALSE FALSE  TRUE

데이터프레임 전체에 몇개의 결측지가 존재하는지 확인

inData02<-inData01
inData02[which(inData02$Species=="setosa"&inData01$Petal.Width > 0.3),]<-NA
head(is.na(inData02))
##      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## [1,]        FALSE       FALSE        FALSE       FALSE   FALSE
## [2,]        FALSE       FALSE        FALSE       FALSE   FALSE
## [3,]        FALSE       FALSE        FALSE       FALSE   FALSE
## [4,]        FALSE       FALSE        FALSE       FALSE   FALSE
## [5,]        FALSE       FALSE        FALSE       FALSE   FALSE
## [6,]         TRUE        TRUE         TRUE        TRUE    TRUE
colSums(is.na(inData02))
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
##            9            9            9            9            9

결측값 모두 조회

inData02[!complete.cases(inData02),]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 6            NA          NA           NA          NA    <NA>
## 16           NA          NA           NA          NA    <NA>
## 17           NA          NA           NA          NA    <NA>
## 22           NA          NA           NA          NA    <NA>
## 24           NA          NA           NA          NA    <NA>
## 27           NA          NA           NA          NA    <NA>
## 32           NA          NA           NA          NA    <NA>
## 44           NA          NA           NA          NA    <NA>
## 45           NA          NA           NA          NA    <NA>

결측치만 빼고 다시 데이터 생성

inData03<-na.omit(inData02)
colSums(is.na(inData03))
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
##            0            0            0            0            0

 

데이터 정렬

데이터 정렬에 대해서 알아보자

Order는 정렬될 데이터의 위치를 알려줌
즉 14번, 9번이 데이터상 첫번째, 두번째로 정렬 되어야 한다는 것임

order(inData01$Sepal.Length)
##   [1]  14   9  39  43  42   4   7  23  48   3  30  12  13  25  31  46   2
##  [18]  10  35  38  58 107   5   8  26  27  36  41  44  50  61  94   1  18
##  [35]  20  22  24  40  45  47  99  28  29  33  60  49   6  11  17  21  32
##  [52]  85  34  37  54  81  82  90  91  65  67  70  89  95 122  16  19  56
##  [69]  80  96  97 100 114  15  68  83  93 102 115 143  62  71 150  63  79
##  [86]  84  86 120 139  64  72  74  92 128 135  69  98 127 149  57  73  88
## [103] 101 104 124 134 137 147  52  75 112 116 129 133 138  55 105 111 117
## [120] 148  59  76  66  78  87 109 125 141 145 146  77 113 144  53 121 140
## [137] 142  51 103 110 126 130 108 131 106 118 119 123 136 132

정렬순대로 데이터 조회

#Head()는 데이터 건수가 많아서 상위 몇개만 조회 목적으로 사용함
head(inData01[order(inData01$Sepal.Length),])
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 14          4.3         3.0          1.1         0.1  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 39          4.4         3.0          1.3         0.2  setosa
## 43          4.4         3.2          1.3         0.2  setosa
## 42          4.5         2.3          1.3         0.3  setosa
## 4           4.6         3.1          1.5         0.2  setosa

응용1. 열명을 정렬도 가능함

head(subset(inData01, Species=="setosa" , select=c(1:5)))
##   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
head(subset(inData01, Species=="setosa" , select=c(order(colnames(inData01)))))
##   Petal.Length Petal.Width Sepal.Length Sepal.Width Species
## 1          1.4         0.2          5.1         3.5  setosa
## 2          1.4         0.2          4.9         3.0  setosa
## 3          1.3         0.2          4.7         3.2  setosa
## 4          1.5         0.2          4.6         3.1  setosa
## 5          1.4         0.2          5.0         3.6  setosa
## 6          1.7         0.4          5.4         3.9  setosa

 

데이터 확인

  • Str : 데이터 구조 확인
  • summary : 데이터 요약 정보
  • plot : 산점도
  • boxplot : 박스플랏
  • quantile : 백분위수
str(inData01)
## '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 ...
summary(inData01)
##   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  
##                 
##                 
## 
plot(inData01)

boxplot(data=inData01, Sepal.Length~Species)

quantile(inData01$ Sepal.Length)
##   0%  25%  50%  75% 100% 
##  4.3  5.1  5.8  6.4  7.9

 
 
 
 

끝인사

R Logo

데이터 예제로 도움이 되었으면 합니다.
모두가 R를 잘 사용하는 그날까지..

Thanks & best regards