본문 바로가기

■ 프로그래밍/R

[R 기초] 데이터 유형 - Vector

[ R 데이터 유형 : Vector ]


# 주석
## 결과값

Data Type

1. Vector
2. Factor *
3. Matrix
4. Array
5. Data Frame ***
6. List *
(* 중요도)


1. Vector—-

[특징]
- 하나의 열(column)로 구성되어 있음
- 1차원 구조
- 하나의 데이터 유형만 받음
- 데이터 분석의 기본

1.1 Vector 만들기—-

  1. 하나의 값(element)으로 이루어진 vector
v1 <- 10 # numeric vector
v2 <- "Lee" # character vector, element 1
v3 <- FALSE # logical vector, element 1


  1. 두 개 이상의 값으로 이루어진 vector

i. c(element, element, …)

  • c는 combine, concatenate의 약자
  • numeric, character, logical vector 모두 생성 가능
age <- c(34, 28, 25, 25, 23) #규칙이 없는 것들은 c
bt <- c("b", "b", "b", "a", "b", "a") #character vector, 6 element
smoke <- c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) #logical vector, 6 element
c(1, "Lee", TRUE)
c(1, TRUE)
age2 <- c(24, 28, 25, 24)
age3 <- c(age, age2)


ii. :

  • numeric vector에만 적용
  • 1씩 증가되는 숫자들 또는 1씩 감소되는 숫자들로 구성된 벡터를 만들 때 사용
  • start:end
  • start < end : 1씩 증가
  • start > end : 1씩 감소
  • start == end : start or end
  • start에 있는 숫자부터 시작해서 end에 있는 숫자를 넘지 않을 때까지 1씩 증감
v1 <- 1:10
v1
10:1
-3.3:1
 ## -3.3 -2.3 -1.3 -0.3  0.7
1:-3.3
 ## 1  0 -1 -2 -3


iii. seq(from = , to = , by = )

[특징]
- numeric, vector에만 적용
- :의 확장
0 모든 증가/감소의 폭 지정 가능
- seq(from = start, to = end, by = 증감의 폭)

seq(from = 1, to = 5, by = 0.001)
seq(from = 5, to = 1, by = -0.001)


iv. sequence(숫자)

[특징]
- numeric, vector에만 적용
- 1 ~ ‘숫자’ 사이의 정수
- ’숫자’는 양수이어야 함

sequence(10)
sequence(3.5)
sequence(1)
sequence(-3)


문제 1. 아래가 나오게 하려면 어떤 코드를 수행해야 하는가?

##  [1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5

(정답은 맨 밑에)

v. rep(vector, times = , each = )

  • rep : replicate의 약자
  • numeric, character, logical vector 만들수 있음
  • 주어진 벡터를 복사해 주는 기능
rep(1, times = 10)
rep(1, each = 10)
rep(1:3, times = 10) ## 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
rep(1:3, each = 10) ## 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
rep(1:3, times = 5, each = 10)
##   [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1
##  [36] 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1
##  [71] 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
## [106] 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2
## [141] 3 3 3 3 3 3 3 3 3 3
  • times와 each를 같이 쓴다면, each가 먼저 실행된다


문제 2. 아래가 나오게 하려면 어떤 코드를 수행해야 하는가?

##  [1] "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c"



문제 3. 아래가 나오게 하려면 어떤 코드를 수행해야 하는가? (a: 10개, b: 6개, c: 7개)

##  [1] "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" "b" "b" "b" "b" "b" "b" "c"
## [18] "c" "c" "c" "c" "c" "c"


1.2 Vector의 속성

  1. 데이터의 개수 : length(vector)
money <- c(300, 50, 1000, 100, 100)
length(money) ## 5
  1. element의 이름 : names(vector)
names(money) ## NULL
  • Object가 없는 값 : NULL
  • Object 1. data 2.graph
names(money) <- c("Mat", "Pat", "R", "Python", "SQL")
names(money) ## "Mat"   "Pat"  "R"  "Python"  "SQL"
money ##    Mat    Pat      R Python    SQL 
      ##   300     50   1000    100    100 

names(money) <- NULL # names 다시 지우기


1.3 Vector의 Index

money <- c(300, 50, 1000, 100, 100)

첫 번째 element의 위치가 1로 시작함


1.4 Vector의 Slicing

vector[index]

money[1] ## 300
money[3] ## 1000
money[5] ## 100


문제 4. 아래가 나오려면 어떤 코드를 수행해야 하는가?

## [1] 300 100 100


문제 5. 아래가 나오려면 어떤 코드를 수행해야 하는가?

## [1]   50 1000  100  100


문제 6. 아래 처럼 홀수번째를 한번에 가져오려면 어떤 코드를 수행해야 하는가?

## [1]  300 1000  100


1.5 Vector의 연산

v1 <- 1:3
v2 <- 4:6
v3 <- v1+v2
v3

벡터화(Vectorization)

v4 <- 1:6
v1 + v4  #재사용 규칙(Recycliing Rule), v4는 한 번 더 반복해서 더해짐
## [1] 2 4 6 5 7 9
v5 <- 1:7
v1 + v5
## Warning in v1 + v5: 두 객체의 길이가 서로 배수관계에 있지 않습니다
## [1] 2 4 6 5 7 9 8

데이터 개수의 배수가 되지 않아, 완전한 재활용이 안됨.


[정답]
문제 1. sequence(1:5)
문제 2. rep(c(“a”,“b”,“c”), times=5)
문제 3. rep(c(“a”,“b”,“c”), times = c(10, 6, 7))
문제 4. money[c(-2,-3)] 혹은 money[c(1,4,5)]
문제 5. money[-1] 혹은 money[2:5]
문제 6. money[seq(from = 1, to = 5, by = 2)] 혹은 money[seq(from = 1, to = length(money), by = 2)] (데이터의 양이 변할 수 있으니)