Must Learning With Statistics

2. R 기본문법 1단계 본문

MustLearning with R 1편

2. R 기본문법 1단계

Doublek Park 2020. 1. 29. 19:09

Chapter2. R 기본문법 1단계

기본적으로 Rstudio 편집기를 기준으로 진행합니다. Rstudio를 시작하기에 앞서, 몇 가지 중요한 Tip을 드리자면 다음과 같습니다.

  • 처음 시작하는 분들이 가장 많이 틀리는 부분은 오타입니다.

  • 소,대문자를 구분하기 때문에 오타가 특히 많이 발생합니다.

  • 특히 ‘No such file or directory’라는 Error가 발생한다면 오타가 발생하거나, 저장을 안한 것이니 코드를 다시 한번 확인하시길 바랍니다.

  • 작성하다가 Tab키를 누르면, 자동완성창이 뜹니다. 적극 활용하시길 바랍니다.

  • 우측 상단의 Environment창에서 데이터가 잘 불러와지고 저장되고 있는지 꾸준히 확인하면서 진행하면, 오류 발생을 줄일 수가 있습니다.

  • Rstudio는 한글에 친화적이지 않으니 최대한 영어를 사용하시길 바랍니다.

1. 할당 및 논리문

  • 할당
    지정해주는 명칭(저장소)에 값을 저장해주는 매우 기본적인 컴퓨터 언어입니다. > = : ~를 ~에 저장하여라
A = 2 
print(A) 
[1] 2

실행결과, A에 2가 저장되었으며, 출력하면 2가 나오는 것을 확인할 수 있습니다.

  • 논리문
    값이 지정해준 조건을 만족하는지 값을 출력해주는 기본적인 컴퓨터 언어입니다. ‘TRUE’ 혹은 ’FALSE’값을 출력해줍니다. ’TRUE’는 조건을 충족한다는 의미이며, ’FALSE’는 그 반대입니다.
    > == : 인지 판단하여라
A == 2
[1] TRUE

!= : 아닌지 판단하여라.

A != 2
[1] FALSE

2. c()의 활용

  • 벡터의 생성

c()는 Combind의 약자를 나타내는 명령어로, R에서 매우 자주 쓰이는 명령어입니다. c()는 벡터를 만드는데 사용됩니다. 여기서 벡터라고 하면, 데이터에서 하나의 ’열(Column)’을 의미합니다. 즉, 데이터가 세로로 저장된다고 생각하시면 됩니다.

c() : 벡터의 생성

B = c(2,3,4,5) 

print(B) 
[1] 2 3 4 5

3. rep(), sep()을 통한 벡터 생성

  • 순차적인 수열 생성 sequence의 줄임말로 순차적인 데이터를 생성할 때 쓰입니다.

seq() : seq(from = 시작 숫자 , to = 마지막 숫자, by = 증가범위)

# 1 ~ 10 까지 1씩 증가하는 수열 생성
x1 = c(1:10) 
x1_2 = seq(from = 1, to = 10,by = 1) 

# 1 ~ 10까지 2씩 증가하는 수열 생성
x2 = seq(from = 1, to = 10,by = 2) 
print(x1)
 [1]  1  2  3  4  5  6  7  8  9 10
print(x1_2)
 [1]  1  2  3  4  5  6  7  8  9 10
print(x2)
[1] 1 3 5 7 9
  • 반복적인 수열 생성 rep()는 repeat의 줄임말로 반복된 데이터를 생성할 때 쓰입니다.

rep() : rep(반복할 값, 반복할 횟수)

# 1을 10번 반복
y = rep(1,10) 
print(y)
 [1] 1 1 1 1 1 1 1 1 1 1
y2 = rep(c(1,10), 2)
print(y2)
[1]  1 10  1 10
y3 = rep(c(1,10), c(2,2))
print(y3)
[1]  1  1 10 10

4. matrix(), data.frame()을 통해 데이터 셋 만들기

  • matrix의 생성

R에서는 일반적으로 데이터 셋을 matrix형태 혹은 data.frame형태로 정리한 후, 분석을 진행하는 경우가 많습니다.

matrix(data = 데이터 , nrow = 행의 수, ncol = 열의 수, byrow = 행/열 기준)

MATRIX_R = matrix(
data = x1, 
nrow = 5
)
print(MATRIX_R)
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
MATRIX_C = matrix(
data = x1, 
ncol = 5
)
print(MATRIX_C)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
  • dataframe의 생성
DATA_SET = data.frame(
X1 = x1, # 변수명 = 벡터 값,
X1_2 = x1_2,
X2 = x2,
y = y 
)
  • 데이터 상위단 보기

head()는 데이터의 상단 부분을 지정해주는 행만큼 출력해주는 함수입니다. 현재 5로 설정하였으니 1 ~ 5행을 보여줍니다.

head(데이터 프레임)

print(head(DATA_SET,5))

5. length(), dim()을 활용한 데이터 형태 파악하기

저장된 데이터의 형태를 파악하는 것은, 데이터 분석 진행 상황 중에 틈틈히 확인을 해야하는 사항입니다.

  • 1차원 벡터인 경우, length()를 활용합니다.

length(1차원 벡터)

# 벡터에 속한 원소의 갯수
length(x1)
[1] 10
  • 2차원 행렬, 데이터프레임인 경우에는 dim()을 활용합니다.

dim(행렬 혹은 데이터프레임)

# 행, 열
dim(MATRIX_R)
[1] 5 2
dim(DATA_SET)
[1] 10  4

6. 괄호의 활용

괄호에는 (), {}, []가 있습니다. 모든 컴퓨터 언어에서는 각 괄호의 종류에 따라 쓰이는 방식이 다릅니다. R에서는 이렇게 나뉩니다.

  • ( )

()는 실행 함수(function)과 함께 쓰입니다. 예를 들어, c()에서 c()는 들어오는 값들을 묶어 하나의 벡터로 만드는 기능을 실행합니다. ()안에는 분석하고자 하는 원소(element)값들이 입력되어야 합니다.

# ( )
A=c(1,2,3,4,5) 
print(A)
[1] 1 2 3 4 5
  • { }

{ }는 for, if문 등에서 조건식을 삽입할 때 쓰입니다. 예를들어, A 벡터에 속해 있는 값들을 순서대로 출력을 해보도록 하겠습니다.

# { }
for(i in A){
print(i) # {} 안에 실행 함수를 삽입
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

이번에는 빈 공간을 가지는 벡터를 하나 만든 다음, 빈 벡터에 값을 차례대로 삽입해보도록 하겠습니다.

B = c() # 빈 공간의 벡터 생성

for(k in seq(from = 1, to = 10, by = 1)){

B = c(B,k)

}
print(B)
 [1]  1  2  3  4  5  6  7  8  9 10
  • []

[]는 Index를 입력해야 될 때 쓰입니다. 처음 시작하는 분들이 가장 틀리는 곳이 대괄호의 활용입니다. 언뜻 보기에는 쉽지만, 나중에 상당 수의 Error는 여기서 발생하고 있습니다. 1차원 벡터의 경우, 간단하게 보고 싶은 위치만 입력하면 되지만, 2차원이상의 데이터 셋에서는 보고싶은 [행,열]을 구분하여 입력을 해야합니다.

1차원 데이터의 경우

# 2번째 값
A[2] 
[1] 2
# 1,2번째 값
A[1:2]
[1] 1 2
# 3번째 값 빼고
A[-3]
[1] 1 2 4 5
# 1,2,4,5번째 값
A[c(1,2,4,5)]
[1] 1 2 4 5

2차원 data.frame()형태의 경우

# 1행 전부
DATA_SET[1,] # 1행 전부
  X1 X1_2 X2 y
1  1    1  1 1
# 1열 전부
DATA_SET[,1] 
 [1]  1  2  3  4  5  6  7  8  9 10
# 1,2,3 행 & 2열 빼고 나머지
print(DATA_SET[c(1,2,3),-2]) 
  X1 X2 y
1  1  1 1
2  2  3 1
3  3  5 1

7. 변수 형태 이해하기

R에서는 데이터의 타입을 다음으로 정리를 하며, 보통 ’Strings’라고 부릅니다.

  • Strings 파악이 중요한 이유

Strings에 따라 완전히 다른 분석결과가 나올 수 있습니다. 예를 들어, 순서형 변수를 명목형 변수로 취급하는 경우, 순서형에 속한 서열정보를 포기하여 분석하게 되는 경우가 발생합니다. 또한 명령어에 따라 Error가 발생할 수 있습니다. 데이터를 변환하는 과정에서 값이 괴상하게 변경되는 상황도 발생합니다. 무엇보다 가장 중요한 이유는 분석하고자 하는 변수들의 Strings에 따라 분석방법론이 정해지게 됩니다.

변수의 특성에 대한 내용은 매우 간단하지만, 분석 과정에서는 많은 실수가 발생할 수 있으며, 개인적으로는 분석가의 센스가 가장 중요하게 적용되는 부분입니다.

  • Discrete(이산형): 하나, 둘, 셋, 넷 등 셀 수 있는 변수

명목형 변수: 특성에 따라 명칭을 주어 구분을 지어주는 변수, 변수 값에 따라 서열 정보가 존재하지 않고 모두 동등한 것으로 판단합니다.

서열형 변수: 명목형 변수에서 서열 정보가 주입된 변수, 그에 따라 명목형 변수에 비해 정보량을 더 많이 포함하고 있습니다.

  • Continuous(연속형): 셀 수 없고 구간으로 정의된 변수

정보량을 가장 많이 품고 있는 변수입니다.

  • 변수의 척도에 따른 정보량

대학생 성적을 예시로 삼았을 때, 명목형으로 변수를 취급할 경우, 학생의 학점이수여부만을 확인할 수 있지만, 서열형으로 취급할 때는 학점 이수를 한 학생 중에서 D0 ~ A+의 성적을 확인할 수 있습니다. 더 나아가, 연속형으로 취급할 경우에는 같은 A+내에서도 백분위를 통해 서열을 알아낼 수가 있습니다. 즉, 정보량은 명목형에서 연속형으로 갈수록 더 많아지게 됩니다.

  • 데이터의 변환
    정보량이 풍부한 연속형의 데이터가 순서, 명목형으로 변환이 되는 것은 가능하지만, 명목형이 순서 혹은 연속형 데이터로, 순서형 데이터를 연속형으로 취급하기에는 정보량이 부족하기에 변환이 불가능합니다.

  • 데이터 타입 확인
    기본적으로 저장된 데이터들의 타입은 str()명령어를 통해 확인합니다.

str(벡터, 행렬, 데이터 등 모든 저장값)

Numeric_Vector = c(1:20)
Chr_Vector = c("A","B","C")
str(Numeric_Vector)
 int [1:20] 1 2 3 4 5 6 7 8 9 10 ...
str(Chr_Vector)
 chr [1:3] "A" "B" "C"

8. 시간(날짜)형태의 변수 다루기

R에서 시간(날짜) 데이터 다루는 방법은 크게 3가지 방법이 있습니다.
1. as.Date()를 활용하여 ‘년-월-일’ 형태로 다루기
2. as.POSIXct()를 활용하여 ‘년-월-일 시:분:초’ 형태로 다루기
3. lubridate패키지를 활용하여 날짜 데이터 다루기

lubridate패키지를 다루는 방법은 여기서 다루지 않도록 하겠습니다.

  • as.Date()를 활용하는 경우

날짜가 입력된 포맷에 맞춰 옵션값에 설정을 해줘야 합니다.

as.Date(변수, format = “날짜 형식”)

처음 입력되었을 때는, strings가 character였지만, as.Date를 통해 strings가 Date로 변한 것을 확인할 수가 있습니다.

DATE_O = "2018-01-02"
DATE_C = as.Date(DATE_O, format = "%Y-%m-%d")
str(DATE_O)
 chr "2018-01-02"
str(DATE_C)
 Date[1:1], format: "2018-01-02"
  • as.POSIXct()를 활용하는 경우

POSIXct는 시간:분:초까지 활용할 수가 있습니다.

as.POSIXct(날짜, format = “날짜형식”)

DATE_O2 = "2015-02-04 23:13:23"
DATE_P = as.POSIXct(DATE_O2, format = "%Y-%m-%d %H:%M:%S")
str(DATE_P)
 POSIXct[1:1], format: "2015-02-04 23:13:23"
  • format()의 활용

날짜정보를 뽑아 새로운 변수를 만들 수 있습니다.

format(날짜변수, “형식”)

format(DATE_P,"%A")
[1] "수요일"
format(DATE_P,"%S")
[1] "23"
format(DATE_P,"%M")
[1] "13"
format(DATE_P,"%Y")
[1] "2015"

9. as & is를 통해 strings 확인 및 변경하기

  • as()

as는 “변수 x를 ~로 취급하겠다.” 라는 의미를 가집니다. 또한 summary()는 매우 자주 쓰이는 명령어이며, 데이터의 타입에 따라 결과값이 다르게 나옵니다.

x=c(1,2,3,4,5,6,7,8,9,10) 

x1 = as.integer(x)
x2 = as.numeric(x)
x3 = as.factor(x)
x4 = as.character(x)
str(x1)
 int [1:10] 1 2 3 4 5 6 7 8 9 10
summary(x1)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    3.25    5.50    5.50    7.75   10.00 
str(x2)
 num [1:10] 1 2 3 4 5 6 7 8 9 10
summary(x2)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    3.25    5.50    5.50    7.75   10.00 
str(x3)
 Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
summary(x4)
   Length     Class      Mode 
       10 character character 
str(x4)
 chr [1:10] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
  • is()
    is는 논리문으로써 변수 x가 ~인지 판단하여라. 라는 의미를 가집니다. str()은 단순히 Stirngs를 확인하는 것이지, 논리문으로 결과를 반환해주지 못합니다. 그렇기에 논리조건이 필요할 때는 is.()를 써야 합니다.
x=c(1,2,3,4,5,6,7,8,9,10)
y=c("str",'str2',"str3","str4")
is.integer(x)
[1] FALSE
is.numeric(x)
[1] TRUE
is.factor(y)
[1] FALSE
is.character(y)
[1] TRUE

10. sample()을 통한 데이터 무작위 추출하기

데이터가 너무 방대한 경우, 필요 없이 긴 연산을 해야될 때가 있습니다. 이런 경우 무작위 추출을 통해 데이터의 특성은 살리면서, 연산속도를 낮추는 경우가 종종 필요합니다. replace = FALSE는 비복원 추출을 하겠다는 의미입니다.

sample(데이터 추출 범위, 데이터 추출 갯수 , replace = “FALSE OR”TRUE")

# 로또 번호 추첨
S1 = sample(1:45, 6, replace = FALSE) # 1 ~ 45 중에 6개의 숫자를 비복원 추출하겠다.
print(S1)
[1] 36 28  5 16 26 13

sample()같은 무작위 값을 결과를 내는 코드는 무작위 결과값(실행할 때마다 다르게 나오는)을 고정시켜야 할 때가 있습니다. 이런 경우, set.seed()를 이용하여 결과값을 고정합니다.

set.seed(1234)
S2 = sample(1:45, 6, replace = FALSE)
print(S2)
[1]  6 28 27 43 36 26

set.seed()의 괄호 안에는 아무 숫자를 저장해주면 됩니다. 그 숫자에 함께 실행된 무작위 결과값이 저장되어 있습니다. 정확한 기능 확인을 위해서는 set.seed()를 포함하여 sample()을 돌려본 다음, sample()만 돌려보시면 바로 확인할 수 있습니다.

11. 조건문(if) 활용하기

데이터를 분석하다보면, 반복작업을 진행해야되거나, case by case별로 데이터를 정리해야 될 때가 있습니다. 이런 경우, 하나씩 입력하는 것보다는 for문과 if문을 사용하는 것이 훨씬 일이 효율적입니다. for문은 앞서 중괄호 활용 때 다뤄봤으니, if문을 활용하도록 하겠습니다.

A = c(1,2,3,4,5)

if( 7 %in% A){ # %in% A에 속해 있는지 확인하는 논리문
print("TRUE")
} else{ 
print("FALSE")
}
[1] "FALSE"

12. function()을 통해 사용자함수 만들기

대부분의 통계 분석은 R에 내장되어 있는 함수와 패키지들을 추가로 다운받아 해결할 수가 있습니다. 하지만 가끔 직접 함수를 만들어야 될 때가 있습니다. function()을 통해 사용자 함수를 만듭니다.

  • 입력 값에 +1을 해주는 함수를 만들기
Plus_One = function(x){
y = x+1 
return(y)
}
Plus_One(3)
[1] 4

13. R 패키지 설치하기

R은 프로그램이 가벼운 대신, 필요한 함수는 패키지를 설치하여 사용해야 됩니다. 패키지를 설치한 후에는 항상 패키지를 R에 부착시켜야 합니다.

install.packages("ggplot2") # ggplot2라는 패키지 설치
library(ggplot2) # ggplot2 패키지 부착

14. 연습문제

  1. sample()을 활용해서 로또번호(1 ~ 45, 6개)를 추첨하여라.

  2. 다음의 수열로 구성 된 벡터를 생성하시오.

\[ AV = (1,3,5,7,9,\cdots,99)\\ BV = (1,1,2,2,3,3,4,4,5,5) \]

  1. 다음과 같은 행렬을 생성하시오.

\[ M = \begin{bmatrix} \ 1 & 2 & 3\\ \ 4 & 5 & 6\\ \ 7 & 8 & 9 \end{bmatrix} \]

  1. funtion()을 사용하여 다음의 함수를 만드시오.

\[ Quadratic(x,y) = x^2+ y + 10 \]

  1. for()문을 활용하여 구구단을 만드시오.

\[ 1*1 = 1 \\ 1*2 = 2 \\ \cdots \\ 9*9 = 18 \]

'MustLearning with R 1편' 카테고리의 다른 글

6. R 중급문법 2단계  (0) 2020.01.29
5. R 기본문법 4단계  (2) 2020.01.29
4. R 기본문법 3단계  (0) 2020.01.29
3. R 기본문법 2단계  (1) 2020.01.29
1. R에 대한 소개  (1) 2020.01.29
Comments