728x90
반응형

저번 포스트에선 행렬 생성과 행과 열의 이름 변경, 행렬의 정보 얻기 등을 공부해보았다.
이번 포스트에선 행렬 데이터 접근, 행렬의 연산에 대해 학습해보자.

 

행렬 데이터 접근하기

  • 행렬은 색인 또는 행과 열의 이름을 통해서 접근할 수 있다.
  • 행렬은 벡터와 같게 [] 대괄호를 이용해서 데이터에 접근한다.
  • 단 행렬은 벡터와 다르게 2개의 차원인 행(Row), 열(Column)으로 구성되어 있으므로, 2개의 index를 부여해야한다.
  • Matrix[행index,열index]로 행렬 데이터에 접근할 수 있다.
  • Indexing 예시는 다음과 같다.
    • Matrix[row_id, col_id]
      : 행렬의 row_id 행과 col_id 열에 지정된 값을 가지고 온다. 이 때, row_id나 col_id에 벡터를 사용하여 여러 값을 지정할 수 있다. row_id나 col_id 둘 중 하나를 생략하면 전체 행이나 열을 뜻한다.
    • Matrix[1:3,]
      : 1~3 행의 데이터를 가지고 온다.
    • Matrix[-3,]
      : 3행의 데이터를 제외하고 모두 가지고 온다.
    • Matrix[c(1,3),]
      : 1, 3 행만 가지고 온다.
    • Matrix[,c("col5", "col3")]
      : 행렬 또한 행과 열에 부여된 이름으로 불러올 수 있다.

      ※ 접근한 행렬의 색인이나 이름의 순서에 따라서 행렬의 배열은 바뀌게 된다!
# 행렬에서 내가 원하는 데이터만 가지고 와보자.
vt = c(80, 60, 70, 75,
       90, 70, 60, 60,
       85, 90, 40, 70,
       80, 75, 90, 80,
       85, 80, 70, 65)
mat <- matrix(vt, nrow = 5, byrow = TRUE, dimnames = list(c("민철", "재성", "기훈", "재빈", "현희"), c("수학", "영어", "국어", "탐구")))
mat

※ 행렬과 같은 형태로 벡터를 생성한다면, 행렬 생성이 보다 편리하다.

##      수학 영어 국어 탐구
## 민철   80   60   70   75
## 재성   90   70   60   60
## 기훈   85   90   40   70
## 재빈   80   75   90   80
## 현희   85   80   70   65
# 행렬에서 민철, 기훈, 현희의 수학 점수와 국어 점수를 가지고 와보자..
mat[c("민철", "기훈", "현희"), c("수학", "국어")]
##      수학 국어
## 민철   80   70
## 기훈   85   40
## 현희   85   70
# 행렬에서 2번 행부터 4번 행까지 가지고 와보자.
mat[2:4,]
##      수학 영어 국어 탐구
## 재성   90   70   60   60
## 기훈   85   90   40   70
## 재빈   80   75   90   80
# 행렬에서 3번째 행만 제외하고 가지고 와보자.
mat[-3,]
##      수학 영어 국어 탐구
## 민철   80   60   70   75
## 재성   90   70   60   60
## 재빈   80   75   90   80
## 현희   85   80   70   65
# 행렬에서 1, 3 행만 가지고 와보자.
mat[c(1,3),]
##      수학 영어 국어 탐구
## 민철   80   60   70   75
## 기훈   85   90   40   70
# 행렬에서 국어 점수와 수학 점수 순서로 가지고 와보자.
mat[,c("국어", "수학")]
##      국어 수학
## 민철   70   80
## 재성   60   90
## 기훈   40   85
## 재빈   90   80
## 현희   70   85

 

 

 

 

행렬의 연산

: 행렬 내부에서 할 수 있는 연산과 행렬과 스칼라 간의 연산, 행렬과 행렬 간의 연산에 대해 알아보자.

행렬 내 연산

  • rowMeans() / colMeans()
    : 행의 평균을 구한다. / 열의 평균을 구한다.
  • rowSums() / colSums()
    : 행의 합을 구한다. / 열의 합을 구한다.
  • 위 행렬을 기반으로 실습을 해보자.
    ※ Indexing과 조합하여 내가 원하는 값만 가지고 와서 연산해보도록 하자.
# 위 행렬이 1반이라고 가정할 때, 1반 학생들 개개인의 총 점수를 구하자.
rowSums(mat)
## 민철 재성 기훈 재빈 현희 
##  285  280  285  325  300
# 1 반 학생들의 과목별 평균 점수를 구하자.
colMeans(mat)
## 수학 영어 국어 탐구 
##   84   75   66   70
# 민철, 기훈, 현희의 평균 점수를 구하자.
rowMeans(mat[c("민철", "기훈", "재빈"),])
##  민철  기훈  재빈 
## 71.25 71.25 81.25
# 재성, 재빈, 현희의 수학, 국어 점수의 평균 점수를 구하자.
rowMeans(mat[c("재성", "재빈", "현희"),c("수학", "국어")])
## 재성 재빈 현희 
## 75.0 85.0 77.5
# 1반의 수학 총점과 평균 점수를 구하자.
math_Vt = mat[,"수학"]
sum(math_Vt)
## [1] 420
mean(math_Vt)
## [1] 84

 

 

행렬과 스칼라 간의 연산

  • 행렬과 스칼라 간의 연산은 아주 간단하다.
  • + - * / ^ 등을 그대로 사용하면 된다.
mat1 = matrix(c(1:12), nrow = 3, byrow = TRUE)
mat1 + 10
##      [,1] [,2] [,3] [,4]
## [1,]   11   12   13   14
## [2,]   15   16   17   18
## [3,]   19   20   21   22
mat1 - 10
##      [,1] [,2] [,3] [,4]
## [1,]   -9   -8   -7   -6
## [2,]   -5   -4   -3   -2
## [3,]   -1    0    1    2
mat1 * 10
##      [,1] [,2] [,3] [,4]
## [1,]   10   20   30   40
## [2,]   50   60   70   80
## [3,]   90  100  110  120
mat1 / 10
##      [,1] [,2] [,3] [,4]
## [1,]  0.1  0.2  0.3  0.4
## [2,]  0.5  0.6  0.7  0.8
## [3,]  0.9  1.0  1.1  1.2

 

 

행렬과 행렬의 연산

  • 행렬과 행렬의 연산은 다양한 전제 조건이 붙는다.
  • 행렬의 합과 차를 하려면 두 행렬의 크기가 서로 같아야 하며, 행렬의 곱을 하려면 앞 행렬과 뒤 행렬의 열과 행의 수가 동일해야한다. 
  • 행렬의 합과 차는 +, -로 기존 연산자와 동일하나 행렬간 곱은 %*%로 연산자가 다르다.
  • 전치행렬을 이용하면 언제든지 행렬 곱을 할 수 있다.
    • 전치행렬은 각 원소의 행과 열을 바꾼 행렬로, 어떤 크기의 행렬이라도 전치 행렬을 만들 수 있다.
    • 전치 행렬은 행과 열을 교환한 것이므로, 언제든지 행렬곱을 할 수 있다.
      보다 엄밀히 말하면, 주대각선을 축으로 하는 반사 대칭을 가하여 얻은 행렬이라고 할 수 있다.
    • 전치 행렬은 t(행렬)을 하면 생성할 수 있다.
mat1 = matrix(c(1:12), nrow = 3, byrow = TRUE)
mat2 = matrix(c(12:1), nrow = 3, byrow = TRUE)

# 행렬간 합과 차를 해보자
mat1 + mat2
##      [,1] [,2] [,3] [,4]
## [1,]   13   13   13   13
## [2,]   13   13   13   13
## [3,]   13   13   13   13
mat1 - mat2
##      [,1] [,2] [,3] [,4]
## [1,]  -11   -9   -7   -5
## [2,]   -3   -1    1    3
## [3,]    5    7    9   11
# 전치행렬 곱을 해보자
mat1 %*%t(mat1)
##      [,1] [,2] [,3]
## [1,]   30   70  110
## [2,]   70  174  278
## [3,]  110  278  446

 

 

 

이번 포스트에서는 행렬의 Indexing과 행렬의 연산 등에 대하여 학습해보았다.

다음 포스트에선 역행렬을 비롯한 약간 독특한 형태의 행렬들에 대해 가볍게 학습해보자.

728x90
반응형

'R > Basic' 카테고리의 다른 글

R(기초) 배열(Array)  (0) 2020.06.19
R(기초) 행렬(Matrix)(3부)  (0) 2020.06.19
R(기초) 행렬(Matrix)(1부)  (0) 2020.06.18
R(기초) 연산자와 변수 타입  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(2부)  (0) 2020.06.18
728x90
반응형

이번에는 행렬(matrix)에 대해 학습 해보자, 행렬은 통계 분석부터 요즘 핫한 딥러닝까지 두루 쓰이는 것으로, 행렬에 대해 자세히 파고 들어간다면, 몇 주 동안 행렬에 대해서만 다뤄도 부족할 것이다.

지금은 행렬에 대해 기초적인 수준에서 접근을 해볼 것이며, 총 3개의 파트로 나눠 학습해보고자 한다.

파트1에선 R에서 행렬의 생성과 기본적인 접근법, 파트2에선 행렬의 Indexing과 행렬 연산 등을 공부하고, 파트3에선 가운데 행렬과 같은 조금 특이한 행렬에 대해 학습하도록 하자.

행렬(Matrix)

: 벡터를 행과 열로 갖는 표 형식으로 확장한 것이 행렬이다.

  • 행렬에는 한 가지 유형의 스칼라만 사용할 수 있다.
  • 행렬에 들어가는 Data는 일반적으로 벡터가 들어간다.
    (즉, 1차원인 벡터를 2차원으로 바꾼 것을 행렬이라고 할 수 있다.)

 

행렬 생성

  • matrix()
    : 행렬을 생성한다.
  • 주요 Parameter
    : matrix(data, nrow: 행의 수, ncol: 열의 수, byrow: 행부터 데이터를 채움, dimnames: 행렬의 각 차원에 부여할 이름)
# matrix를 만들어보자.
vt = seq(from = 1, by = 2, length = 12)
mat = matrix(vt, nrow = 4, byrow = TRUE, dimnames = list(c("r1", "r2", "r3", "r4"), c("c1", "c2", "c3")))
mat

※ dimnames에 들어간 list는 추후 공부할 데이터 타입으로, n개의 데이터  타입을 담을 수 있는 형태라고 보면 된다.
자세한 것은 추후 학습하도록 하자.

##    c1 c2 c3
## r1  1  3  5
## r2  7  9 11
## r3 13 15 17
## r4 19 21 23

 

 

행렬의 크기와 벡터의 길이가 다를 경우

  • 만약, 벡터의 길이가 행렬을 구성하기에 적합하지 않은 길이인 경우, 오류 메시지가 발생하고 벡터의 앞부분부터 행렬의 빈자리에 들어가게 된다.
# matrix를 만들어보자.
vt_diff = seq(from = 1, by = 2, length = 10)
mat_diff = matrix(vt_diff, nrow = 5, ncol = 4, byrow = TRUE)
mat_diff
##      [,1] [,2] [,3] [,4]
## [1,]    1    3    5    7
## [2,]    9   11   13   15
## [3,]   17   19    1    3
## [4,]    5    7    9   11
## [5,]   13   15   17   19
  • 위 행렬에서 볼 수 있듯이 3행 3열부터 Data로 들어간 벡터가 처음부터 값이 입력되었다.

 

 

행렬의 기본적인 정보를 가지고 와보자.

# 대상이 될 행렬.
vt = seq(from = 1, by = 2, length = 12)
mat <- matrix(vt, nrow = 4, byrow = TRUE, dimnames = list(c("r1", "r2", "r3", "r4"), c("c1", "c2", "c3")))

1) 행렬의 차원별 이름 가지고 오기.

  • dimnames()
    : 객체의 각 차원 이름을 가지고 온다.(dim = dimension)
  • rownames()
    : 행렬의 행 이름을 가지고 온다.
  • colnames()
    : 행렬의 열 이름을 가지고 온다.
# 행렬의 각 차원 이름을 모두 가지고 와보자.
dimnames(mat)
## [[1]]
## [1] "r1" "r2" "r3" "r4"
## 
## [[2]]
## [1] "c1" "c2" "c3"
# 행렬에서 행 이름을 가져와보자.
rownames(mat)
## [1] "r1" "r2" "r3" "r4"
# 행렬에서 열 이름을 가져와보자.
colnames(mat)
## [1] "c1" "c2" "c3"

 

2) 행렬에 다른 이름을 부여해보자.

  • 행렬의 차원별 이름 바꾸기는 들어가는 데이터 타입만 다를 뿐 벡터와 동일하다.
# 행렬에 다른 이름을 부여해보자.
dimnames(mat) <-list(c("a1", "a2", "a3", "a4"), c("b1", "b2", "b3"))
mat
##    b1 b2 b3
## a1  1  3  5
## a2  7  9 11
## a3 13 15 17
## a4 19 21 23
# 행의 이름을 바꿔보자.
rownames(mat) <- c("행1", "행2", "행3", "행4")
mat
##     b1 b2 b3
## 행1  1  3  5
## 행2  7  9 11
## 행3 13 15 17
## 행4 19 21 23
#열의 이름을 바꿔보자.
colnames(mat) <- c("열1", "열2", "열3")
mat
##     열1 열2 열3
## 행1   1   3   5
## 행2   7   9  11
## 행3  13  15  17
## 행4  19  21  23

 

3) 행렬의 크기에 관한 정보를 가지고 와보자.

  • nrow()
    : 행렬의 행의 갯수
  • ncol()
    : 행렬의 열의 갯수
  • dim()
    : 행렬의 차원별 크기
  • length()
    : 행렬 내 원소들의 수 (벡터의 길이와 동일하다!)
  • mode()
    : 행렬 내 원소의 타입 확인
  • str()
    : 행렬뿐만 아니라 벡터, 데이터 프레임 등에서도 사용되는 것으로, 원소의 양, 차원, 차원 이름, 원소의 타입 등 데이터의 전반적인 정보를 가지고 온다.
# 행렬의 행의 갯수를 가지고 와보자.
nrow(mat)
## [1] 4
# 행렬의 열의 갯수를 가지고 와보자.
ncol(mat)
## [1] 3
# 행렬의 차원별 크기를 가지고 와보자.
dim(mat)
## [1] 4 3
# 행렬에 있는 원소의 수를 가지고 와보자
length(mat)
## [1] 12
# 행렬의 원소 타입을 확인해보자.
mode(mat)
## [1] "numeric"
# 행렬의 정보들을 정리해서 봐보자!
str(mat)
##  num [1:4, 1:3] 1 7 13 19 3 9 15 21 5 11 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:4] "r1" "r2" "r3" "r4"
##   ..$ : chr [1:3] "c1" "c2" "c3"

 

4) 행렬의 형태를 바꿔보자.
: 행렬의 차원 변경은 원소의 수가 같다면 쉽게 할 수 있다.

# 행렬의 차원을 바꿔보자.
dim(mat) <- c(2,6)
mat
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1   13    3   15    5   17
## [2,]    7   19    9   21   11   23

 

 

 

벡터들을 합쳐서 행렬을 만들어보자.

  • 두 개 이상의 벡터를 묶어서 행렬을 만들어보자.
  • cbind()
    : 열로 벡터들을 묶는다.
  • rbind()
    : 행으로 벡터들을 묶는다.
  • rbind()나 cbind()는 Matrix뿐만 아니라 R에서 가장 많이 쓰이는 데이터 타입인 DataFrame에서도 쓰인다.
  • 만약 벡터의 길이가 동일하지 않는다면, 경고문을 띄운 후 길이가 가장 긴 벡터에 맞게 다른 벡터들은 앞부분부터 뒤에 추가하여 생성된다.
vt1 = c(1:6)
vt2 = c(8:3)
vt3 = rep(c(1,2,3), times = 2)
vt4 = c("a", "b", "c", "d", "e", "f")
vt5 = c(1:10)
# 열로 묶어보자
cbind(vt1, vt2, vt3)
##      vt1 vt2 vt3
## [1,]   1   8   1
## [2,]   2   7   2
## [3,]   3   6   3
## [4,]   4   5   1
## [5,]   5   4   2
## [6,]   6   3   3
# 행으로 묶어보자
rbind(vt1, vt2, vt3)
##     [,1] [,2] [,3] [,4] [,5] [,6]
## vt1    1    2    3    4    5    6
## vt2    8    7    6    5    4    3
## vt3    1    2    3    1    2    3
# 숫자 벡터에 문자 벡터를 섞어보자
cbind(vt1, vt2, vt3, vt4)
##      vt1 vt2 vt3 vt4
## [1,] "1" "8" "1" "a"
## [2,] "2" "7" "2" "b"
## [3,] "3" "6" "3" "c"
## [4,] "4" "5" "1" "d"
## [5,] "5" "4" "2" "e"
## [6,] "6" "3" "3" "f"

※ 숫자형 벡터와 문자형 벡터를 하나의 행렬로 묶는 경우, 행렬엔 하나의 변수 타입만 들어갈 수 있으므로 character형으로 바뀐 것을 볼 수 있다.

# 길이가 다른 벡터를 추가해보자
cbind(vt1, vt2, vt3, vt5)
## Warning in cbind(vt1, vt2, vt3, vt5): number of rows of result is not a multiple
## of vector length (arg 1)
##       vt1 vt2 vt3 vt5
##  [1,]   1   8   1   1
##  [2,]   2   7   2   2
##  [3,]   3   6   3   3
##  [4,]   4   5   1   4
##  [5,]   5   4   2   5
##  [6,]   6   3   3   6
##  [7,]   1   8   1   7
##  [8,]   2   7   2   8
##  [9,]   3   6   3   9
## [10,]   4   5   1  10

※ 길이가 다른 벡터가 추가 되면, 길이가 짧은 벡터들은 앞 부분부터 반복하여 생성되는 것을 알 수 있다.

 

 

 

지금까지 행렬에 대한 기본적인 정보를 가지고 노는 법에 대해 학습해보았다.

눈치가 빠른 사람이라면, 행렬의 이름 부여, 크기 보기 등이 꽤나 비슷한 것을 알 수 있는데, R에서 사용하는 대부분의 데이터 형태 조작 방법이, 이 틀에서 크게 벗어나지 않는다는 점이, R로 데이터를 가지고 놀 때 매우 편리한 부분이다.

다음 포스트에선 행렬 데이터 접근(Indexing), 행렬의 연산에 대하여 다뤄보도록 하겠다.

 

 

 

728x90
반응형
728x90
반응형

이번 포스트에선 연산자와 변수의 타입에 대해 공부해보자.

논리연산자(Logical Operators)

: 논리연산자는 if문과 같이 조건을 부여하는 경우 사용되는 연산자로 매우 자주 쓰이니 꼭 기억하도록 하자.

논리연산자 기능 논리연산자 기능
< 작다 <= 작거나 크다
> 크다 >= 크거나 같다
== 같다 != 같지 않다
| 또는(Or, 합집합) & 그리고(And, 교집합)
%in% 매칭연산자    

※ 매치 연산자(Matching operator): %in% 기호로 변수의 값이 지정한 조건 목록에 해당하는지 확인하는 기능을 한다.

 

 

산술연산자(Arithmetic Operator)

: 계산을 할 때 사용되는 기호이므로, R을 사용할 때, 상식이라고 할 수 있으니 절대 잊지 말자!

산술연산자 기능 산술연산자 기능
+ 더하기 - 빼기
* 곱하기 / 나누기
^ , ** 제곱 %/% 나눗셈의 몫
%% 나눗셈의 나머지    

 

 

변수 타입(Variable Type)

: R이 기본적으로 가지고 있는 변수 타입이다. R을 사용할 때, 꼭! 신경써야하는 부분으로, 변수 타입이 잘못된 경우, 오류가 발생할 수 있다.

※ 반대로 말하자면 변수 타입만 잘 잡아도 꽤 많은 오류를 방지할 수 있다.

변수 타입 의미 예시 변수 타입 의미 예시
numeric 실수 1, 12.3 logical 논리 TRUE, FALSE
integer 정수 3, 10, 15 factor 범주 1, 2, a, b
complex 복소수 3+2i date 날짜 2019-01-27
character 문자 "banana", "apple"      

 

 

이번 포스트는 매우 짧지만 엄청 중요한 내용이므로, 상식처럼 알고 있어야한다.

다음 포스트에선 데이터 타입: 행렬에 대해 공부해보자.

728x90
반응형
728x90
반응형

벡터(Vector) - 2부

이전 포스트에선 벡터에 대한 기초적인 개념과 벡터를 Slicing하는 법을 알아보았다.
(Slicing은 Index를 이용하여 내가 원하는 원소만 가지고 오는 것을 말한다.)

이번엔 벡터의 연산과 연속하는 벡터를 만드는 법에 대해 알아보자.

 

 

벡터의 연산

  • 벡터는 원소 하나하나에 접근하여 각 원소마다 연산을 수행하거나, 벡터 전체를 일괄적으로 연산할 수 있고, 벡터를 집합으로 취급하여 집합 연산(합집합, 교집합, 차집합)을 할 수도 있다.
  • 벡터의 연산결과는 벡터이다.
  • 벡터와 벡터의 연산은 같은 위치의 원소끼리 연산된다.
# 자릿수가 맞는 벡터의 연산
x <- c(1,2,3,4,5)
y <- c(5,4,3,2,1)

x+y
## [1] 6 6 6 6 6

 

  • 자릿수가 맞지 않는 벡터를 연산하는 경우, 경고가 뜨면서 자릿수가 적은 벡터에 대하여 그 앞부분을 뒤에 추가해 벡터의 자릿수를 맞춰서 연산한다.
# 자릿수가 맞지 않는 벡터의 연산
x <- c(1,2,3,4,5)
y <- c(3,2,1)

x+y
## Warning in x + y: 두 객체의 길이가 서로 배수관계에 있지 않습니다
## [1] 4 4 4 7 7

 

  • ==, != 연산자를 사용해 두 벡터에 저장된 값들을 한 번에 비교할 수 있다. 그러나 if문과 같은 조건문에서는 단 하나의 참 또는 거짓 값을 사용하므로, ==, !=가 아닌 indentical()을 사용해야한다.
  • identical()
    : 객체가 동일한지 판단한다.
# identical을 써서 두 벡터의 동일 여부를 따져보자.
x <- c(1,2,3,4,5)
y <- c(1,2,3,4,5)

identical(x, y)
## [1] TRUE
x1 <- c(5,4,3,2,1)
y1 <- c(1,2,3,4,5)
identical(x1, y1)
## [1] FALSE

 

  • 벡터를 집합(Set)으로 취급하여 집합 간 합집합, 교집합, 차집합을 계산해보자.
# 대상이 될 집합
A = c(1,2,3,4,5,6)
B = c(1,3,5,7,8)
  • union()
    : 합집합을 구한다.
union(A, B)
## [1] 1 2 3 4 5 6 7 8
  • intersect()
    : 교집합을 구한다.
intersect(A, B)
## [1] 1 3 5
  • setdiff()
    : 차집합을 구한다.
setdiff(A, B)
## [1] 2 4 6
  • setequal()
    : 동일한 집합인지 판단한다.
setequal(A, B)
## [1] FALSE

 

※ identical()와 setequal()의 차이

# identical과 setequal의 차이
A = c(1,2,3,4,5)
B = c(5,4,3,2,1)
identical(A, B)
## [1] FALSE
setequal(A, B)
## [1] TRUE
  • identical()은 두 벡터의 원소가 동일할지라도 순서가 다른 경우 동일한 벡터로 인식하지 않는다.
  • setequal()은 벡터를 집합으로 보며, 집합에게 있어서 순서는 중요한 것이 아니며, 단순히 원소의 존재만을 신경쓰므로, 동일한 집합으로 인식한다.

 

  • Vector %in% element
    : Vector에 element가 있는지 파악한다.
  • 자주 쓰이는 코드 중 하나로, 꼭 기억해놓도록 하자!
# Vector %in% element
vt1 <- c("apple", "grape", "melon", "apple")
vt1 %in% "apple"
## [1]  TRUE FALSE FALSE  TRUE
sum(vt1 %in% "apple")
## [1] 2

※ sum()을 이용해 TRUE의 갯수를 세면, apple이 벡터 내에 몇 개 있는지 알 수 있다.

vt1 %in% "pineapple"
## [1] FALSE FALSE FALSE FALSE
sum(vt1 %in% "pineapple")
## [1] 0
  • Boolean의 성격인 TRUE == 1, FALSE == 0을 이용하여, 특정 문자가 있는지 여부와 그 문자가 몇 개나 있는지를 확인해 보았다.

 

 

연속하는 벡터

: 벡터는 매우 많이 사용하는 데이터 타입이며, 특정 패턴으로 연속하는 벡터를 만들 일은 생각보다 자주 있다.
 이번엔 패턴을 가지고 연속하는 벡터를 만들어보도록 하자.

  • from:to 를 써보자.
    : from부터 to까지의 숫자에 대한 벡터를 반환함(from과 to포함)
# from:to
3:7
## [1] 3 4 5 6 7
c(3:7)
## [1] 3 4 5 6 7
3:-3
## [1]  3  2  1  0 -1 -2 -3

※ 위처럼 값을 증가 시키는 것뿐 아니라 감소시키는 것도 가능하다.

 

  • seq()
    : 연속한 값을 생성한다.
  • 주요 Parameter
    : seq(from: 시작 값, to: 끝 값, by: 증가치, length: 벡터의 길이, length.out: 연속된 값의 생성 개수)
    ※ 함수에 마우스 커서 혹은 드래그를 하고 F1을 누르면 해당 함수에 대한 상세한 설명을 볼 수 있다.
# seq 함수를 써보자.
seq(from = 1, to = 10, by = 2)
## [1] 1 3 5 7 9
seq(1,10,2)
## [1] 1 3 5 7 9

※ R을 비롯한 다양한 언어들에서 Parameter의 이름(from, to, by와 같은 것)을 쓰지 않더라도, Parameter와 동일한 순서로 Parameter를 입력하면, 동일한 결과가 도출 된다.

# 1부터 10까지를 7등분한 벡터
seq(1,10,length = 7)
## [1]  1.0  2.5  4.0  5.5  7.0  8.5 10.0
# 1부터 3씩 증가하는 길이 7의 벡터
seq(from = 1, by = 3, length.out = 7)
## [1]  1  4  7 10 13 16 19

 

  • seq_along():
    주어진 객체의 길이만큼 연속한 값을 생성한다.
    (여기서 길이는 length()의 의미와 동일하다. 숫자가 아닌 Vector를 넣어보자!)
# seq_along을 써보자
seq_along(5)
## [1] 1
seq_along(c("apple", "banana", "melon"))
## [1] 1 2 3

※ 벡터의 길이만큼 연속한 값이 생성되므로, ID와 같은 Index를 위한 벡터 생성 시 편리하다.

 

 

패턴을 가지는 벡터

  • sequence()
    : 주어진 값만큼 숫자를 생성한다(간격은 1이다).
# sequence 함수를 써보자
sequence(3)
## [1] 1 2 3
sequence(c(3,2,4))
## [1] 1 2 3 1 2 1 2 3 4

※ 벡터를 인자로 넣는 경우, 벡터의 원소만큼 독립적으로 반복되어 생성된다.

 

  • rep()
    : 주어진 값을 반복한다.
  • 주요 Parameter
    : rep(x: 반복할 값이 저장된 벡터, times: 반복 횟수, each: 개별 값의 반복 횟수, length: 생성될 벡터의 길이)
# rep을 써보자
# 1~2를 5회 반복해보자
rep(1:2, times = 5)
##  [1] 1 2 1 2 1 2 1 2 1 2
# 2~4를 길이 7까지 반복한다.
rep(2:4, length = 7)
## [1] 2 3 4 2 3 4 2
# 2~4를 각각 3회 반복한다.
rep(2:4, each = 3)
## [1] 2 2 2 3 3 3 4 4 4
# 2~4를 각각 3회씩 3번 반복한다.
rep(2:4, each = 3, times = 2)
##  [1] 2 2 2 3 3 3 4 4 4 2 2 2 3 3 3 4 4 4
# 벡터 c(a,b)에서 앞의 원소는 3회 뒤의 원소는 2회 반복하라
rep(c("a", "b"), c(3, 2))
## [1] "a" "a" "a" "b" "b"

 

 

이번 포스트에선 벡터의 연산부터 연속하는 벡터, 패턴을 갖는 벡터에 대해 학습해보았다. 특히 seq나 rep은 굉장히 단순하면서도 재밌는 기능을 가지고 있는 함수이므로, 꼭 기억하도록 하자.

다음 포스트에선 연산자와 변수 타입에 대해 공부해보도록 하자

728x90
반응형
728x90
반응형

이전 Scalar를 설명하면서 R에 있는 기본적인 Class들에 대해 설명을 하다보니, 분량 조절에 실패를 하고 말았다....
이번엔 R 데이터 타입의 대표 주자인 벡터(Vector)에 대해 설명할 것인데, 벡터는 스칼라보다 다뤄야할 것도 많고, 매우 중요하기도 하므로, 2개 파트로 끊어서 진행할 예정이다.

벡터(Vector)

: R에서 벡터는 가장 대표적으로 사용되는 타입으로, 다른 프로그래밍 언어의 배열(Array)와 대응되는 개념이라고 볼 수 있다. 벡터의 가장 큰 특징은 단 한가지의 클래스만 담을 수 있다는 것이다.

  • 벡터는 한 가지 Class만 담을 수 있으며, 만약 서로 다른 Class가 섞여있다면, 자동으로 그에 맞는 형변환이 이루어진다.
  • R의 벡터는 슬라이스(Slice)를 제공한다. 슬라이스란 벡터의 일부를 잘라낸 뒤, 이를 또 다시 벡터처럼 사용할 수 있는 개념이다.
  • 벡터는 c()안에 원하는 인자를 넣어서 생성할 수 있다.
    (c = Combine, 하나의 단체로 결합하다.)
  • 벡터는 중첩될 수 없다. 따라서 벡터 안에 벡터를 정의하면 단일 차원의 벡터로 변경된다.
  • 벡터의 각 원소에는 이름을 부여할 수 있다.
# 벡터를 생성해보자.
x <- c("1", "2", "3")
x
## [1] "1" "2" "3"
# 벡터 안에 벡터를 넣어서 생성해보자.
c(1,2,3,c(1,2,3))
## [1] 1 2 3 1 2 3
  • Python의 list와 달리 R의 벡터는 벡터 안에 벡터를 넣을 수 없다.
# 벡터의 각 원소에 이름을 지어보자.
math <- c(60, 80, 70)
names(math) <- c("kim", "seo", "park")
math
  • R의 코드는 굉장히 직관적이라고 할 수 있는데, names(data)는 data의 이름을 가지고 오는 함수이다.
  • data의 이름을 가지고 오는 함수에 data의 길이와 같은 벡터를 넣으면, 그것을 이름으로 사용할 수 있다.
##  kim  seo park 
##   60   80   70
names(math)
## [1] "kim"  "seo"  "park"

 

 

벡터의 길이 관련 함수

length(): 객체의 길이를 반환한다.

  • python의 len()과 같은 역할을 하는 함수로 몇 개의 인자를 가지고 있는지 확인할 수 있다.
# 벡터의 길이를 확인해보자.
x <- c(1,2,5,3)
length(x)
## [1] 4

 

NROW(): 벡터나 행렬의 행의 수를 반환한다.

  • NROW()는 그렇게 자주 쓰이는 함수는 아니며, 행렬이나 데이터프레임의 행 개수를 확인하는 nrow()와 유사한 함수이다. 차이는 벡터에서 사용될 수 있는지의 여부이다.
  • 벡터는 각각의 인자를 행으로 잡고 있기 때문에, 행의 개수로 인자의 수를 반환한다. length()와 동일한 기능을 가지고 있으므로, 편하게 length()를 쓰도록 하자.
# 벡터의 행의 수를 확인해보자.
NROW(x)
## [1] 4

 

unique(): 중복된 값을 제외한 벡터.

  • 데이터 프레임에서도 즐겨 사용되는 함수로, 벡터에서는 단순하게 중복 값을 없애는 함수로 인지하면 된다.
    (데이터 프레임에선 중복 행을 제거한다.)
  • 벡터, 데이터 프레임 모든 곳에서 자주 사용하는 함수이므로 꼭, 기억하도록 하자.
# 중복값을 제외한 벡터를 생성해보자.
x <- c(1,1,3,2,3,4,2)
unique(x)
## [1] 1 3 2 4

 

 

 

벡터 내 데이터 접근(Indexing)

: Index를 통해 내가 원하는 데이터를 가지고 오는 것은 데이터 분석의 사전 작업인 전처리(Data Handling)에서 필수 중에 필수이다.

  • 벡터는 [] 안에 Index를 적어서 내가 원하는 원소를 가지고 올 수 있다.
  • R의 인덱스는 Python을 비롯한 다른 언어들과 달리 1로 시작한다.
문법 의미
x[n] 벡터 x의 n번째 원소를 가지고 온다. n은 숫자 또는 원소의 이름인 문자열이다.(names로 확인 가능)
x[-n] 벡터 x의 n번째 원소를 제외한 나머지를 가지고 온다. n은 위의 n과 동일하다.
x[idx_vector] 벡터 x로부터 index vextor에 지정된 원소를 가지고 온다. 이때 idx_vector는 index를 표현하는 숫자 벡터 또는 원소의 이름을 표현하는 문자열 벡터이다.
x[start:end] 벡터 x의 start부터 end까지의 원소를 가지고 온다. 반환 되는 값은 start의 위치 값과 end 위치 값을 모두 포함한다.

 

# 다양한 indexing을 통해 내가 원하는 원소를 가지고 와 보자.
x <- c("apple", "banana", "melon", "chocolate", "ice cream", "corn")
x[5]
## [1] "ice cream"
x[-4]
## [1] "apple"     "banana"    "melon"     "ice cream" "corn"
x[c(1,3,5)]
## [1] "apple"     "melon"     "ice cream"
x[2:5]
## [1] "banana"    "melon"     "chocolate" "ice cream"

 

  • 이번엔 이름으로 가지고 와보자
# 다양한 indexing을 통해 내가 원하는 원소를 가지고 와 보자.
English <- c(60, 70, 80, 90)
names(English) <- c("Kim", "Lee", "Park", "Lim")

English
##  Kim  Lee Park  Lim 
##   60   70   80   90
English["Park"]
## Park 
##   80
English[c("Kim", "Lim")]
## Kim Lim 
##  60  90
# 특정 index의 이름도 쉽게 알 수 있다.
names(English)[2]
## [1] "Lee"

 

 

벡터는 R에서 가장 기본적으로 사용되는 데이터 타입이다보니, 다룰 것이 꽤 많다. 다음 포스트에선 벡터의 연산과 연속하는 벡터를 만드는 법을 한번 공부해보도록 하자.

728x90
반응형

'R > Basic' 카테고리의 다른 글

R(기초) 연산자와 변수 타입  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(2부)  (0) 2020.06.18
R(기초) 데이터 타입: 스칼라 (Scalar)  (0) 2020.06.18
R(기초)의 데이터 타입과 변수  (0) 2020.06.17
R이란?  (0) 2020.06.16
728x90
반응형

스칼라 (Scalar)

: 스칼라는 단일 차원의 값을 뜻하며, 길이가 1인 벡터와 동일하다. 즉, 구성인자가 하나인 벡터를 말한다.

  • 스칼라는 정수, 부동소수, 문자열(""나 ''로 묶인), 논리값(TRUE, T, FALSE, F), NA, NULL의 데이터 타입을 갖는다.
  • 스칼라를 쉽게 이야기 하자면, 값이 딱! 한 개만 있는 상태라고 생각하면 된다.
  • 스칼라(Scalar)에선 R에 있는 다양한 Class에 대해 이야기해보도록 하겠다.
  • R에 있는 다양한 Class를 설명하면서, 벡터(Vector)를 예시로 들 수 있다. 벡터는 R에서 가장 기본적인 데이터 타입 단위이며, 스칼라는 벡터를 구성하는 하나하나의 원소라고 단순히 생각해도 무방하다.
    (벡터를 비롯한 다양한 연산자들은 다음 포스트에서 자세히 다루도록 할테니, 진행하다가 설명이 부족하거나 이해가 안되더라도 넘기면서 따라오기를 바란다.)

 

 

 

NA (Not Available)

  • 데이터에 값이 존재하지 않는다는 뜻으로 결측치(Missing Value)이다.
    (결측치: 어떠한 이유로 인해, 값이 빠져 있는 경우다.)
  • 데이터 분석을 할 때, 결측값이 존재한다면, 데이터 분석 결과를 왜곡 시킬 위험이 있기 때문에 결측값이 발생한 원인과 결측값의 존재를 반영하여 분석을 진행해야한다.
    (결측값에 대해선 추후 심도 깊게 다룰 예정이다.)
  • 결측값의 존재를 파악하는 대표적인 함수는 in.na() 함수이다.

 

 

 

NULL

  • "아무 가치도 없는, 효력이 없는"이라는 뜻을 가진 NULL은, 값이 있어야 하는데 빠져버린 NA와 달리 값이 아직 정해지지 않은 상태를 의미한다.
  • NULL은 프로그래밍의 편의를 위해 미정(Undefined) 값을 표현하는데 사용하는 개념으로, 아직 정해지지 않은 값을 표현할 때 사용되는 값이다.
  • NULL의 존재를 파악하는 대표적인 함수는 is.null() 함수이다.

 

 

 

문자열(String, Character)

  • 문자열은 ""나 ''로 묶어서 지정한다.
  • What's your name과 같이 문자 안에 ' (Quote) 기호가 들어가 있는경우 "What's your name"과 같이 쌍 따옴표(Double Quote)를 사용해서 묶어주면 된다.
  • is.character() 함수를 이용하여 문자열 여부를 확인할 수 있다.
  • noquote() 함수나 print(data, quote = FALSE)로 Qutation을 출력하지 않을 수 있다.
  • R은 다른 프로그래밍 언어랑 다르게 문자형과 문자열을 구분하지 않는다.

 

문자열 사용 방법

1) Quote 사용하기
   : ""(Double Quotation)이나 ''(Single Quotation)을 사용하여 묶는다.

x1 <- ""
class(x1)
## [1] "character"
length(x1)
## [1] 1
x2 <- "car"
length(x2)
## [1] 1
  • R에서 length() 함수는 뒤에서 배울 데이터(벡터, 데이터프레임 등)의 길이를 재는 함수로, ""나 "car"모두 1자리 값인 스칼라이므로 length가 1로 나온 것을 알 수 있다.
  • 즉, Quotation을 사용하여 문자열을 생성하면 1개의 스칼라가 생성되는 것을 알 수 있다.

 

2) character() 사용하기

y1 <- character()
class(y1)
## [1] "character"
length(y1)
## [1] 0
y2 <- character(5)
y2
## [1] "" "" "" "" ""
length(y2)
## [1] 5
y2[3] <- "third"
y2[7] <- "seventh"
y2
## [1] ""        ""        "third"   ""        ""        NA        "seventh"

## 값이 없는 index에도 새로운 인자를 추가할 수 있음
  • character() 함수는 주어진 Parameter만큼 문자열 벡터를 생성하는 함수이다.
  • character(5)로 길이가 5인 문자열 벡터를 생성하는 경우, 벡터의 길이를 벗어난 index에 값을 부여할 수 있으며, 그 사이에 있는 값은 NA처리가 된다.

 

문자열(character) 벡터에서 원소인 문자들의 길이를 확인해보자.

  • R에서 기본으로 제공하는 data인 mtcars를 이용해보자.
# R의 내장 Data인 mtcars의 행이름을 cars라는 변수에 담아보자
cars <- rownames(mtcars)

# nchar함수를 이용해서 문자의 길이들을 알아보자
nchar(cars)
  • nchar()은 number of character이라는 의미로 문자의 길이를 확인할 때 사용하는 함수이다.
##  [1]  9 13 10 14 17  7 10  9  8  8  9 10 10 11 18 19 17  8 11 14 13 16 11 10 16
## [26]  9 13 12 14 12 13 10
  • []는 위치를 말하며 [1]은 바로 오른쪽에 있는 인자가 1번째 인자임을 의미한다.
    (R은 Python을 비롯한 다른 언어들과 달리 숫자가 1부터 시작한다.)
    [26]은 바로 오른쪽에 있는 인자가 26번째 인자임을 의미한다.
# 가장 길이가 긴 문자의 길이를 보자
max(nchar(cars))
## [1] 19
# 가장 이름이 긴 문자의 위치를 보자
which(nchar(cars) == max(nchar(cars)))
## [1] 16
# 가장 이름이 긴 원소를 가지고 와보자
cars[which(nchar(cars) == max(nchar(cars)))]
## [1] "Lincoln Continental"
  • 내가 원하는 조건의 인자 위치를 확인하는 함수인 which()와 가장 큰 값을 찾는 함수인 max(), 문자 길이를 찾는 함수인 nchar(), 특정 위치에 있는 값을 가지고 오는 [] 이 4가지를 조합하여, 가장 길이가 긴 문자를 가지고 오는 코드를 만들어보았다.

 

 

 

진리값, Boolean형(Boolean Expression)

  • 컴퓨터는 0과 1의 bit로 계산을 하는데, 0은 거짓이라 하면, 0 이외의 값은 참으로 인식한다.
  • TRUE, T는 참값이므로 TRUE == 1
  • FALSE, F는 거짓이므로 FALSE == 0으로 인식한다.
  • 위 성질을 이용하여 벡터나 데이터 프레임에서 참의 갯수를 셀수도 있다.
  • TRUE, FALSE는 예약어(Reserved words), T와 F는 TRUE와 FALSE로 초기화된 전역 변수(Global variable)이다.
    • 이는 T에 FALSE를 F에 TRUE를 할당하는 것이 가능하다는 것이다.
    • 위와 같은 문제 발생을 막기 위해 가능한 T, F로 쓰지말고 TRUE, FALSE로 쓰도록 하자.
  • 진리값에는 논리연산자를 사용할 수 있다.
의미 논리연산자 설명
NOT ! 참은 거짓, 거짓은 참으로 반전시킴.
AND & 양쪽 모두 참이어야 한다.
OR | 양쪽 중 하나만 참이어도 참으로 한다.
AND && 양쪽 모두 참이어야 하며, 벡터의 요소 간 계산이 아닌 한 개의 Boolean 값끼리의 연산을 위한 연산자이다.
OR || 양쪽 중 하나만 참이어도 참이며, 벡터의 모든 요소 간 계산이 아닌, 한 개의 Boolean 값끼리의 연산을 위한 연산자.
XOR xor(A, B) 함수로 제공, A와 B가 서로 다를 때만 참이다.
  • &와 &&의 차이
c(TRUE, TRUE) & c(TRUE, FALSE)
## [1]  TRUE FALSE
c(TRUE, FALSE) & c(TRUE, FALSE)
## [1]  TRUE FALSE
c(TRUE, TRUE) && c(TRUE, FALSE)
## [1] TRUE
c(TRUE, FALSE) && c(TRUE, FALSE)
## [1] TRUE
c(FALSE, TRUE) && c(FALSE, TRUE)
## [1] FALSE
c(FALSE, FALSE) && c(FALSE, FALSE)
## [1] FALSE
  • &는 Boolean이 저장된 인자(스칼라)끼리 연산하여, 참, 거짓을 각각 구분한다.
  • &&는 벡터 안에 들어잇는 인자 간 계산이 아니라 한 개의 Boolean값만 연산한다. 또한 &&나 ||는 short-circuit를 지원한다. 따라서 위 와 같이 Boolean으로 구성된 2개의 인자를 가진 벡터 A와 벡터 B가 존재하고 이 둘을 A && B로 계산하는 경우, A가 만약 TRUE라면 B도 평가하지만 A가 FALSE라면 B가 TRUE던 FALSE던 의미가 없으므로 평가하지 않는다.

 

Boolean 활용 방법

 : Boolean은 활용도가 매우 높은 Class이다.
  다음 R에서의 예제를 보며, 한 번 따라해보도록 하자.

# x는 숫자타입(numeric), y는 문자타입(character)으로 생성해보았다.
x <- c(1,2,3,4,5)
y <- c("1", "2", "3", "4", "5")

x == y
## [1] TRUE TRUE TRUE TRUE TRUE
# x에서 3보다 큰 인자만 TRUE로 나타내어라.
x>3
## [1] FALSE FALSE FALSE  TRUE  TRUE
# x에서 3보다 큰 인자들을 TRUE(=1)로 나타내고, 그 합을 구하여라
sum(x>3)
## [1] 2
  • 주의할 사항이며, Boolean의 성질이다.
    • x>3을 하는 경우 FALSE   FALSE   FALSE   TRUE   TRUE로 결과가 나오는데, 앞에서 이야기했듯이 FALSE == 0, TRUE == 1이다.
    • 그러므로, sum(x>3)을 하게 되면, 0   0   0   1   1 의 합을 구하게 되는 것이다.
# x에서 3보다 큰 인자들을 가지고오고, 그 인자들의 합을 구하여라.
sum(x[x>3])
## [1] 9
  • x>3인 원소들의 합을 구하고자 한다면 다음과 같이 코드를 짜야한다.
    • 여기서 x[x>3]은 x>3을 했을 때, TRUE인 값만 가지고 오는 것이다.
    • []는 R에서 벡터, 행렬, 데이터프레임 등에서 내가 원하는 값만 가지고 올 때, 쓰이는 것으로 이에 대한 것은 다음 포스트에서 자세히 다루도록 하겠다.
# x에서 3보다 큰 인자들의 위치를 가지고 와라.
which(x>3)
## [1] 4 5
  • which 함수는 내가 벡터, 행렬, 데이터프레임에서 내가 원하는 값의 위치를 알 수 있게 하는 함수로 매우 유용하다.

 

 

 

요인(Factor)

  • 요인(Factor)은 범주형 변수(Categorical Variables)를 위한 데이터 타입이다.
  • Factor가 필요한 이유는 다음과 같다. 성별(Sex)라는 벡터가 있다고 생각해보자, 이 변수에 들어갈 대상이 5명이라고 할 때, 성별을 문자(Female, Male)로 적는 것과 숫자(1,2)로 적는 것 이 둘 중 무엇이 컴퓨터에게 편할지 생각해보며, 해당 글을 읽도록 해보자.
# "male" 하나만 factor로 sex라는 변수에 부여하였다.
sex <- factor("male", c("male", "female"))
sex
## [1] male
## Levels: male female
# 5개의 원소를 factor로써 sex라는 변수에 부여하였다.
sex <- factor(c("male", "male", "female", "male", "female"), c("male", "female"))
sex
## [1] male   male   female male   female
## Levels: male female
# 범주의 수를 확인해보자.
nlevels(sex)
## [1] 2
# 범주 목록을 확인해보자.
levels(sex)
## [1] "male"   "female"
# 범주 목록에서 특정 인자(2번째)만 가지고 와보자.
levels(sex)[2]
## [1] "female"
# 범주 목록을 수정해보자.
levels(sex) <- c("m", "f")
sex
## [1] m m f m f
## Levels: m f
levels(sex) <- c(1, 2)
sex
## [1] 1 1 2 1 2
## Levels: 1 2
  • 요인(Factor)을 사용하면, Data를 연산을 보다 효율적을 할 수 있고(문자보다 숫자가 컴퓨터에겐 당연히 더 알아보기 쉽고, 컴퓨터의 자원(Resource)도 더 적게 먹을 수 있다.)
  • Factor로 하여 숫자로 바꾸면, 우리가 눈으로 보기에는 숫자로 보이나, 실제론 문자이므로 더하기, 곱하기와 같은 연산은 불가능하다.
  • Factor형은 애초에 데이터를 불러오는 과정에서 잡아주어 숫자로 바꿔줄 수 있으므로, 굉장히 편리하다.
  • 그러나, 텍스트 마이닝 같이 문자 그 자체가 분석의 대상인 경우엔 함부로 Factor형으로 바꿔주어서는 안된다. 만약 텍스트 마이닝을 할 것이면서 문자형 데이터를 Factor로 만든 경우, 많은 텍스트 마이닝에 사용되는 함수들이 적용 안될 수 있다.

 

서열척도(Ordinal scale)은?

요인(Factor)는 기본적으로 순서가 없는 명목형 척도(Nominal scale)로 생성된다.  만약 변수가 순서가 있는 경우 서열 척도로 만들어주기 위해 ordered() 함수를 사용하거나, 호출 시 factor()에 Parameter로 ordered = TRUE로 지정해주자.

# 서열척도를 생성해보자.
ordered(c("a", "b", "c"))
## [1] a b c
## Levels: a < b < c
age <- c("old", "old", "middle", "young", "young")
age_order <- ordered(age, c("young", "middle", "old"))

alphabet <- factor(c("a", "b", "a", "c", "b"), ordered = TRUE)
alphabet
## [1] a b a c b
## Levels: a < b < c
  • age는 서열의 기준을 부여하였으나, alphabet 변수는 단순하게 Parameter로 ordered = TRUE로 부여하였다.
  • 단순히 Parameter로 부여하는 경우, 오름차순으로 서열이 부여된다.
  • is.factor(), is.ordered() 함수로 참, 거짓을 확인할 수 있다.

 

 

지금까지 스칼라에 대한 기초적인 개념과 NA, NULL, 문자열, 진리값(Boolean), 요인(Factor)에 대해 알아보았다. 결측값을 의미하는 NA와 값이 아직 정해지지 않은 NULL의 개념은 이번 포스트에서 설명을 끝내기엔 사용처가 많고, 특히 결측값 같은 경우엔, 심도 깊게 들어가야할 필요가 있으므로, 추후 다른 포스트에서 다루도록 하겠다.

다음 포스트는 데이터 타입에서 가장 기본적으로 사용되는 벡터(Vector)에 대해 공부해보도록 하자.

728x90
반응형

'R > Basic' 카테고리의 다른 글

R(기초) 연산자와 변수 타입  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(2부)  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(1부)  (0) 2020.06.18
R(기초)의 데이터 타입과 변수  (0) 2020.06.17
R이란?  (0) 2020.06.16
728x90
반응형

R은 기본적으로 스칼라(Scalar), 벡터(Vector), 리스트(List), 행렬(Matrix), 배열(Array), 데이터 프레임(Data Frame)으로 총 6개의 데이터 타입을 가지고 있다.

물론 이 외에도 다른 라이브러리에서 제공하는 tibble, fread등 다양한 형태가 있지만, 이는 특수한 상황에서 쓰이거나 추후 해당 데이터 타입을 다루는 라이브러리를 학습하면서, 다시 다루게 될 것이므로, 거기까지 생각하진 말도록 하자.

R을 능숙하게 쓰기 위해선 각각의 데이터 타입이 갖는 특징을 이해하고 있어야하며, 특히 Indexing을 이용한, 내가 원하는 데이터만 골라서 가져오기는 Data Handling(데이터 전처리)에서 가장 기본이 되는 부분이다.

 

 

1. 변수(Variable)

데이터 타입 하나하나에 대해 알아보기 전에 변수(Variable)에 대해 알아보자.

변수란 무엇일까?

한국 위키피디아에서 변수는 다음과 같게 설명하고 있다.

  • 변수(變數, variable)는 수학에서 쓰이는 수식에 따라서 변하는 값을 뜻한다.
  • 변수(variable)는 컴퓨터 프로그래밍에서 아직 알려지지 않거나 어느 정도까지만 알려져 있는 양이나 정보에 대한 상징적인 이름이다.

필자가 위 내용을 바탕으로 변수를 좀 더 쉽게 줄여 쓴다면

변수(Variable): "변하는 값으로 다양한 값을 지닐 수 있는 하나의 속성"이라 할 수 있다.
즉, 가변적인 값이 할당되고(변하는 값), 문자, 숫자와 같은 다양한 값이 주어지는 것이 바로 변수이다.

 

 

2. 변수 이름 규칙

R에서 변수 이름 명명 시, 다음과 같은 규칙을 다른다.

  • 알파벳, 숫자, "_"(Underscore), "."(Period)로 구성된다.
  • 첫 글자는 문자 또는 "."로 시작해야한다.
  • "."로 시작한다면 "." 뒤에는 숫자가 올 수 없다.(소수로 인식되므로)
  • 예약어(Reserved word)는 사용할 수 없다.
    (break, else, FALSE, for, function, if, in, Inf, NA, NaN, next, NULL, repeat, TRUE, while 등)
  • 단, T나 F 같은 TRUE와 FALSE로 초기화된 전역변수(Global variable)는 사용할 수 있다.

 

 

3. 변숫값 할당

  • "<-", "<<-", "=" 를 할당 연산자로 사용할 수 있다.
  • "<-"는 어느 곳에서나 쓸 수 있는 반면에, "<<-"는 명령의 최상위 수준에서만 사용할 수 있다.
  • 함수 호출과 동시에 변수에 값을 할당하는 목적으로는 "<-"만 사용할 수 있다.
  • "<-"의 단축키는 "art" + "-"이다. 매우 자주 활용하는 단축키이므로 잊지말도록 하자.

 

 

다음 포스트에선 데이터 타입의 하나인 스칼라(Scalar)에 대해 알아보도록 하자.

728x90
반응형

'R > Basic' 카테고리의 다른 글

R(기초) 연산자와 변수 타입  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(2부)  (0) 2020.06.18
R(기초) 데이터 타입: 벡터(Vector)(1부)  (0) 2020.06.18
R(기초) 데이터 타입: 스칼라 (Scalar)  (0) 2020.06.18
R이란?  (0) 2020.06.16
728x90
반응형

자! 지금까지 R을 써먹기 위한 사전 작업을 끝냈고, 이제 본격적으로 R을 써보도록 하자.

물론 R을 쓰기에 앞서 RStudio를 효율적으로 사용하기 위해서, 간략하게 RStudio의 기능들을 보도록 하자.

 

1. RStudio를 켜보자!

: RStduio를 키게 되면, 방금 전의 새하얀 화면에서 검은 화면으로 바뀐 것은 좋은데, 이젠 뭘 어떻게 해애할까? 라는 고민이 생길 것이다.

 

 

 

2. Script영역: R script를 열어보자.

: 코드와 주석을 적고 관리하는 곳

R Script는 R 코드를 보다 효율적으로 쓰고 관리할 수 있는 영역으로, R을 사용할 때, 실제 코드를 적게 될 곳이다.
R Script는 2가지 방법으로 열 수 있다.

방법1. R Script를 생성하는 가장 기본적인 방법으로 보통 이 방식으로 R Script를 실행한다.
(단축키: Shift + Ctrl + n)

방법2. 위 상황처럼 R Script가 없는 경우 해당 버튼을 누르면, 새로운 R Script가 생성된다. 위 버튼은 본래 각 영역이 접혀 있는 경우, 해당 버튼을 눌러서 각 영역을 여는 것이다.

우리가 컴퓨터에서 흔히 볼 수 있는 최소화 최대화와 비슷한 기능이라고 할 수 있다.

자! 해당 버튼을 누르면 이렇게 Console창 위에 처음보는 영역이 생긴 것을 알 수 있다.
이 곳이 바로 실제 코드와 주석 등이 입력될 Script 영역이다.

 

 

3. Environment/History 영역

: 생성된 변수와 데이터 등을 간략하게 볼 수 있고, 관리할 수 있는 곳.

이 곳은 Environment 영역으로, 말 그대로 R의 재료인 Data들의 환경을 보여주는 곳이다. 
해당 영역에 있는 Data들(객체, 함수 등)이 목록으로 표시가 되며, 대상을 클릭하면 대상의 간략한 특성이나 View로 대상을 볼 수 있다.

이외에도 외부 데이터셋 불러오기, 외부로 내보내기, 삭제 등 아이콘이 존재하며, History 탭에선 RStudio의 사용 History(R Script의 이력)가 나온다. 
>>> History 탭은 Script 영역을 잘 활용하면 사실 볼 일이 거의 없다

 

 

4. Console 영역

코드의 결과가 표시되는 곳.

Console 영역엔  코드를 직접 적을 수도 있고 바로바로 실행할 수 있지만, 실행한 코드는 수정이 불가능하므로 코드 관리가 상당히 어렵다. 그러므로 코드는 Script 영역에 쓰고, Console창은 그 결과를 확인하는 곳으로 주로 사용한다.

추가로 Console 옆에 있는 Terminal을 이용하면 컴퓨터에 직접 연결하여 여러가지 작업을 바로바로 수행할 수 있으나, 이 부분은 꽤 복잡하므로 넘어가도록 한다.

 

 

5. Etc 영역

File, 그림, 설명 등이 써져있는 영역

Files는 윈도우의 탐색기 같은 역활을 한다고 보면 되며, 기본적으로 Work space로 설정이 되어 있다.
파일 찾기, 신규 폴더 만들기, 파일 삭제, 이름 수정, Work space 설정등이 가능하다.

Plot: 그래프가 출력되는 공간으로, 그림이나 PDF 형식으로 파일을 내보낼 수 있다. 

Packages: 설치된 Package들을 확인할 수 있다.

Help: 제일 많이 보게 될 탭 중 하나로, 내가 사용하려는 코드에 대한 설명이 출력되는 영역이다 코드에 커서가 가 있는 상태에서 F1을 누르면 설명을 볼 수 있다.

 

 

6. 번외

보다 자세한 설명을 원하는 사람을 위해 RStudio에서 제공하는 rstudio-IDE-cheatsheet에 있는 UI 설명서도 첨부하였다.
출처: https://rstudio.com/resources/cheatsheets/ 

 

RStudio Cheatsheets

Open source and enterprise-ready professional software for data science

rstudio.com

cheatsheets은 R에 대한 다양한 기능을 보기 좋게 정리해 놓은 것이므로, 참고할만한 가치가 있다.

 

이번 포스트에선 RStudio의 UI에 대해 간략하게 설명을 해봤고, 다음 포스트에서는 본격적으로 R을 활용해 Data를 생성해보도록 하자.

728x90
반응형

'R > 설치 및 환경설정' 카테고리의 다른 글

RStudio의 기본적인 Setting 방법(환경셋팅)  (0) 2020.06.16
R 설치 방법(Windows 환경).  (0) 2020.06.16
728x90
반응형

자! 저번 포스트로 기본적인 R 설치와 RStudio 설치를 완료했다.

본격적인 R 학습에 앞서서 RStudio의 기본 Setting을 해보도록 하자.

 

1. RStudio 관리자 권한으로 실행

아마 처음부터 따라온 사람이라면 RStudio가 아래 사진과 동일한 형태로 들어가 있을 것이다. 자, Rstudio를 실행하기 앞서서, RStudio 실행 시, 자동으로 관리자 권한으로 실행되도록 해보자.

1.1 파일 위치 열기

 

1.2. RStudio의 속성 열기

 

1.3. 관리자 권한으로 실행 체크하기

위 3가지 과정을 진행하면, RStudio를 자동으로 관리자 권한으로 실행되도록 할 수 있다.
(Windows 10 환경에 맞춰진 방식이므로, 다른 환경에서는 동일하게 진행되지 않을 수 있음.)

 

 

2. RStudio 기초 환경 설정

자! 이전 과정들을 통과해서 처음 RStudio를 켜보면, 눈 아픈 하얀색으로 가득 찬 '이제 뭐 어쩌라구?'라는 생각이 드는 화면이 뜰 것이다. 
이제 하나하나 사용자에 맞게 수정을 시작해보도록 하자.

 

2.1 작업 공간(Work Space) 설정

: RStudio에서 작업을 하면서 파일들이 관리될 공간을 설정해보자.
※ RStudio의 기본적인 Option은 상단 메뉴의 Tools > Global Options.. 에 거의 다 있다고 보면 된다.

 

2.2. 원하는 곳에 원하는 이름으로 WorkSpace를 만들자

여기서는 D drive의 RWorkSpace라는 파일을 생성하여, 해당 파일을 Work space로 설정하였다.

 

 

2.3. 한글이 깨져서 보이지 않게 해보자: Encoding 설정

※ 상단 메뉴의 Tools > Global Options.. 을 통해서 다시 Options 창을 열자

 

2.4. RStudio 테마를 보다 이쁘게 바꾸자!

RStudio의 기본 테마는 하얀색이라 눈도 아프고, 코드 가독성도 썩 좋지는 않다(주관적 판단이지만!). 
그러므로, 눈의 피로도 덜하고 코드 가독성도 올라가는 테마로 바꿔주자.

※ 상단 메뉴의 Tools > Global Options.. 을 통해서 다시 Options 창을 열자

Editor theme를 클릭하면 우측에 예시가 뜨며, 눈 건강과 번인현상 걱정이 없는 검은 화면에 코드 가독성이 높은 테마로 변경해주고 Apply > OK를 누르도록 하자.

 

자! 드디어 R로 데이터 분석을 진행할 준비가 끝났다.
다음 포스트에선 R script를 가지고 오는 방법과 UI에 대해 알아보도록 하자.

 
728x90
반응형

'R > 설치 및 환경설정' 카테고리의 다른 글

RStudio의 UI(환경셋팅)  (0) 2020.06.17
R 설치 방법(Windows 환경).  (0) 2020.06.16
728x90
반응형

자! R을 공부하기 위해선, 우선 R부터 설치해보자.
(윈도우 환경에서 설치하는 방법)

 

R을 사용하려면, 2가지가 필요하다.
A. R: 실제 사용 되는 것
B. R Studio: R을 편하게 쓰기 위한 것

 

1. Google에 R을 검색해보자.

(뉴질랜드에서 만들어진 R은 한글과 그리 친하질 않다. 컴퓨터 경로, 사용자 이름, 폴더 이름 모두 다! 영어로 쓰고, 특수문자, 공백도 사용하면 안된다.)

 

 

2. R-project 홈페이지로 들어가서 Download > CLAN으로 들어가자!

 

 

3. 한국 CRAN 서버를 사용하자!

(사실 어느 나라를 쓰던 큰 상관은 없지만... 그래도 이 편이 조금 더 편하다. 그리고 Korea 하단 아무 링크나 눌러도 괜찮다.)

 

 

4. Windows 버전을 설치하자.

(리눅스 설치법은 추후, 분석환경 카테고리에서 다루도록 하겠다.)

 

 

5. R을 처음 설치해보는 당신! base로 설치!

 

 

6. 최신 버전을 다운로드 받자.

(참고로 R, Python 같은 오픈 소스는 최신 버전이라고, 무조건 좋은 것은 아니다. 필요한 라이브러리(모듈)가 R 버전과 맞지 않아 오류를 일으킬 수도 있기 때문이다.)

 

 

7. 본격적인 R 설치!

7.1. 한국어로 설정!

 

 

7.2. 쭉 진행하자!

 

 

7.3. 경로를 변경해주자

Default로 설정된 경로에 공백이 있으므로, 오류가 발생할 수도 있다고 한다. 혹시 모르니 경로에서 공백을 없애주자

 

 

7.4 이후는 모두 Default 값으로 진행하도록 하자!

(설정 손 볼 것 없이, 그냥 쭉쭉 "다음"을 누르며 진행하자!)

 

 

8. RStudio 설치

7까지의 과정을 통해 R 설치는 끝났으나, R을 그대로 쓰면 굉장히 불편하다.
(그냥 하얀 메모장 하나만 가지고 분석을 진행하게 된다고 생각해도 된다.)
그러므로, R 사용 시 편의성을 위해 RStudio를 사용해보자.

8.1 Google에 RStudio 검색!

 

 

8.2 RStudio 홈페이지에서 DOWNLOAD로 들어가자.

 

 

8.3. Desktop용 오픈 소스 라이센스 버전을 다운받자!

 

 

8.4. RStudio For Windows 다운로드!!

아래를 보면 인스톨 버전, 무설치 버전 등이 있으며, OS에 맞게 설치하면 된다.
해당 포스트는 Windows 버전에 대하여 작성하였으므로, 아래 그림과 같이 실시한다.

 

 

8.5 RStudio 설치과정

특이사항은 따로 없으나, 위에서 R을 설치했던 경로랑 동일한 경로에 설치해줘야한다.

 

경로 말고는 따로 신경 쓰지 않아도 된다!!

 

※ R과 RStudio의 경로 설정은 기본 경로대로 진행해도 딱히 큰 문제는 없으나, 경로 안에 공백이 있으므로, 오류가 발생할 수도 있다고 한다.  그러므로 R과 RStudio 설치 시, 경로를 신경 써주도록 하자.

※ Windows의 사용자 이름이 한글로 돼 있는 경우, 오류가 발생할 수 있으므로, 반드시 사용자 이름을 영문으로 바꿔주자.

R은 기본적으로 한글과 그다지 친하지 않으므로, 진행하는 전 과정에서 가능한 한글을 사용하지 않도록 한다.

이번 포스트에서는 R과 RStudio의 설치법을 알아보았으며, 다음 포스트에선 RStudio의 기본적인 셋팅과 UI에 대해 알아보도록 하자.

728x90
반응형

'R > 설치 및 환경설정' 카테고리의 다른 글

RStudio의 UI(환경셋팅)  (0) 2020.06.17
RStudio의 기본적인 Setting 방법(환경셋팅)  (0) 2020.06.16

+ Recent posts