R Programming Langauge/R for Practical Data Analysis

Chapter 03. 데이터 타입 - 1(변수, 스칼라, 벡터, 리스트)

Dev_Kang 2024. 8. 26.

1. 변수

  • R의 변수명은 알파벳, 숫자, '_', '.' 로 구성되며 첫 글자는 문자 또는 '.'으로 시작해야 한다. 만약 '.'으로 시작한다면 뒤에는 숫자가 올 수 없다. 예를 들면 다음과 같다. 
# 올바른 변수명
a
b
a1
a2
.x

#올바르지 않은 변수명
2a
.2
  • R 1.9.0 이전에는 '_'가 변수명에 사용될 수 없었다는 점 때문에 '.'을 주로 사용한다. 예를 들어 training_data, validation_data 같은 변수명 대신 data.training, data.validation과 같이 사용한다.
  • 변수에 값을 할당할 때는 <- 또는 <<- 또는 =를 사용한다. 그러나 =는 때에 따라 사용될 수 없는 경우가 있다. 

2. 스칼라(Scalr)

  • R의 기본형은 벡터이므로 이들 스칼라 자료는 길이 1의 벡터로 볼 수 있다. 

2.1 숫자

  • 정수, 부동 소수 등이 자연스럽게 지원된다.
a <- 3
b <- 4.5
c <- a + b
print(c) # 7.5
  • 위에서 '<-'는 값을 변수에 할당함을 의미한다. c에는 a와 b의 합을 저장하고, 마지막으로 c 변수값을 출력한다. 

2.2 NA

  • 데이터값이 존재하지 않으면 NA로 표시할 수 있다. 예를 들어 4명의 시험점수가 있을 때 그 점수가 각각 80, 90, 75이지만 4번째 사람의 점수를 모른다면 NA로 표현한다. 
one <- 100
two <- 75
three <- 80
four <- NA
is.na(four) # TRUE
  • 어떤 변수에 NA가 저장되어 있는지는 is.na() 함수로 확인할 수 있다. 

2.3 NULL

  • NULL은 NULL 객체를 뜻하는데, 변수가 초기화되지 않은 경우 등에 사용할 수 있다. 어떤 변수에 NULL이 할당되었는지를 is.null()을 사용하여 판단할 수 있다. 
x <- NULL
is.null(x) # TRUE
is.null(1) # FALSE
is.null(NA) # FALSE
is.na(NULL) # logical(0)

2.4 문자열

  • 문자열로 모든 것(한 개 문자 등)을 처리한다. 문자열은 'this_is_string' 또는 "this_is_string"과 같이 어느 따옴표로 묶어도 된다.
a <- "hello"
print(a) # hello

2.5 진리값

  • TRUE, T는 모두 참값을 말한다. FALSE, F는 거짓을 말한다. 진리값에는 & (AND), | (OR), ! (NOT) 연산자를 사용할 수 있다. 
TRUE & TRUE # TRUE
TRUE & FALSE # FALSE
TRUE | TRUE # TRUE
TRUE | FALSE # TRUE
! TRUE # FALSE
! FALSE # TRUE
  • TRUE와 FALSE는 예약어(reserved words)이며 T, F는 각각 TRUE와 FALSE로 초기화된 전역 변수이다. T에 FALSE를 할당하는 것은 가능하지만 TRUE에 FALSE를 할당할 수는 없다. 
T <- FALSE
TRUE <- FALSE # invalid (do_set) left-hand side to assignment
  • AND나 OR 연산자에는 &, | 외에도 &&와 ||가 있다. 이들의 차이점은 &, |은 boolean이 저장된 벡터끼리의 각 원소 간 계산한다. 반면 &&은 한 개의 boolean 값끼리의 연산을 하기 위한 연산자이다.
  • 또 &&, || 는 short-circuit을 지원한다. 따라서 A && B 형태의 코드가 있을 때 A가 만약 TRUE라면 B도 평가하지만, A가 FALSE라면 B를 평가하지 않는다. 
c(TRUE, TRUE) & c(TRUE, FALSE) # TRUE FALSE

2.6 요인(Factor)

  • Factor는 범주형(Categorical) 변수를 위한 데이터 타입이다. 성별은 다음과 같이 지정할 수 있다.
sex <- factor('m', c('m', 'f'))
sex # m, Levels: m f
  • factor()에 주어진 첫 번째 인자는 'sex' 변수에 저장되는 값이다. 그리고 이 범주형 변수는 c('m', 'f')에 표현된 바와같이 2개의 값 m과 f가 가능하다. 
  • Factor 변수는 nlevels()로 범주의 수를 구할 수 있고, levels()로 범주 목록을 알 수 있다. 각 범주의 값은 색인(index)을 활용해 구할 수 있다. 
nlevels(sex) # 2
levels(sex) # "m" "f"
levels(sex)[1] # 'm'
levels(sex)[2] # 'f'
  • level의 값을 직접적으로 수정하고자 한다면 levels()에 값을 할당하면 된다. 'm'을 'male', 'f'를 'female'로 바꿔본다. 
levels(sex) <- c("male", "female")
sex # male, Levels: male female
  • factor()는 기본적으로 데이터에 순서가 없는 명목형 변수(Nominal)를 만든다. 범주형 데이터지만 순서가 있는 값일 경우는 순서형 변수(Ordinal)로 만들기 위해 ordered()를 사용하거나 factor() 호출 시 ordered=TRUE를 지정해 준다. 그러면 Levels에 순서가 < 로 표시되어 있다. 
ordered(c("a", "b", "c")) # a, b, c, Levels: a < b < c
factor(c("a", "b", "c"), ordered=TRUE) # a, b, c, Levels: a < b < c

3. 벡터(Vector)

3.1 벡터의 정의

  • 벡터는 배열의 개념으로, c() 안에 원하는 인자들을 나열하여 정의한다. 나열하는 인자들은 동일한 유형이어야 한다. 만약 다른 타입의 데이터를 섞어서 벡터에 저장하면 한가지 타입으로 자동 형 변환된다. 
  • 아래 코드에서 숫자형 자료인 2는 "2"의 문자열 형태로 자동으로 변환된다. 
x <- c(1, 2, 3, 4, 5)
x # 1 2 3 4 5 
x <- c("1", 2, "3")
x # "1" "2" "3"
  • 벡터는 중첩될 수 없다. 따라서 벡터 안에 벡터를 정의하면 이는 단일 차원의 벡터로 변경된다. 중첩된 구조가 필요하다면 리스트를 사용한다. 
c(1, 2, 3) # 1 2 3
c(1, 2, 3, c(1, 2, 3)) # 1 2 3 1 2 3
  • 숫자형 데이터의 경우 start:end 형태로 시작값부터 끝값까지의 값을 갖는 벡터를 만들 수 있다. 또한 seq(from, to, by) 형태 역시 가능하다. 
x <- 1 : 10
x # 1 2 3 4 5 6 7 8 9 10
x <- 5 : 10
x # 5 6 7 8 9 10
seq(1, 10, 2) # 1 3 5 7 9
  • seq_along()은 인자로 주어진 데이터의 길이만큼 1, 2, 3, ..., N으로 구성된 벡터를 반환한다. seq_len()은 N값이 인자로 주어지면 1, 2, ..., N으로 구성된 벡터를 반환한다. 
seq_along(c("a", "b", "c")) # 1 2 3
seq_len(3) # 1 2 3
  • 벡터의 각 셀에는 이름을 부여할 수 있다. names()에 원하는 이름을 벡터로 넘겨주면 된다. 
x <- c(1, 3, 4)
names(x) <- c("kim", "seo", "park")
x
#  kim  seo park 
#   1    3    4

3.2 벡터 내 데이터 접근

  • 벡터는 [ ] 안에 인덱스를 적어서 각 요소를 가져올 수 있다. 1로 시작한다. 
  • '-인덱스'와 같이 음수의 인덱스를 사용해 특정 요소만 제외할 수도 있다. 
x <- c("a", "b", "c")
x[1] # "a"
x[3] # "c"
x[-1] # "b" "c"
x[-2] # "a" "c"
  • 벡터의 여러 위치에 저장된 값을 가져오려면 벡터명[색인 벡터]의 형식을 사용한다.
x[c(1, 2)] # "a" "b"
x[c(1, 3)] # "a" "c"
  • x[start:end]를 사용해 start부터 end까지의 데이터를 볼 수도 있다. 
x[1:2] # "a" "b"
x[1:3] # "a" "b" "c"
  • 벡터의 각 셀에 names()를 사용해 이름을 부여해 두었다면, 이 이름을 사용해 데이터를에 접근할 수 있다.
  • 벡터에 부여된 이름만 보려면 names를 사용하면 된다.
x <- c(1, 3, 4)
names(x) <- c("kim", "seo", "park")
x
# kim seo park
#  1   3   4
x['seo'] # seo, 3
x[c("seo", "park")] # seo park, 3 4

names(x)[2] # "seo"
  • 벡터의 길이는 length() 또는 NROW()를 통해 알 수 있다. NROW()는 인자가 벡터인 경우 벡터를 n행 1열의 행렬로 취급해 길이를 반환한다. 
x <- n("a", "b", "c")
length(x) # 3
nrow(x) # NULL
NROW(x) # 3

3.3 벡터 연산

  • %in% 연산자는 어떤 값이 벡터에 포함되어 있는지를 알려준다.
"a" %in% c("a", "b", "c") # TRUE
"d" %in% c("a", "b", "c") # FALSE
  • 벡터를 집합으로 취급해 집합 간 합집합(union), 교집합(intersect), 차집합(setdiff)을 계산할 수 있다.
  • 집합 간 비교는 setequal()을 사용한다.
setdiff(c("a", "b", "c"), c("a", "d")) # "b" "c"
union(c("a", "b", "c"), c("a", "d")) # "a" "b" "c" "d"
intersect(c("a", "b", "c"), c("a", "d")) # "a"

setequal(c("a", "b", "c"), c("a", "b")) # FALSE
setequal(c("a", "b", "c"), c("a", "b", "c", "d")) # FALSE

3.4 seq

  • 1부터 31까지의 숫자를 저장한 벡터를 표현하려면 c(1, 2, 3, .., 31) 같이 숫자를 모두 나열해야 한다. seq(시작 값, 마지막 값, 증가치)의 형태로 호출하면 된다. 이때 증가치는 생략할 수 있다. 
  • 더욱 짧게 표현하려면 시작 값:마지막 값 형태로 적어도 된다.
seq(1, 5) # 1 2 3 4 5
seq(1, 5, 2) # 1 3 5

1:5 # 1 2 3 4 5

3.5 rep

  • 특정 값들이 반복된 벡터를 손쉽게 만들려면 rep()을 사용한다. 1, 2를 총 5회 반복한 벡터를 만드는 예이다. 
rep(1:2, 5) # 1 2 1 2 1 2 1 2 1 2
  • 이와 달리 1이 5회, 2가 5회 반복된 벡터를 만들기 위해서는 다음과 같다.
rep(1:2, 5) # 1 2 1 2 1 2 1 2 1 2
rep(1:2, each=5) # 1 1 1 1 1 2 2 2 2 2

4. 리스트(List)

  • 리스트는 (키, 값) 형태의 데이터를 저장하는 연관 배열(associative array)이다.

4.1 리스트의 정의 

  • 리스트는 list(키=값, 키=값, ...) 형태로 데이터를 나열해 정의한다. 
x <- list(name="foo", height=70)
x
# $name
# "foo"

# $height
# 70
  • 각 값이 반드시 스칼라일 필요는 없고 다음처럼 벡터를 저장할 수도 있다.
x <- list(name="foo", height=c(1, 3, 5))
x
# $name
# "foo"

# $height
# 1 3 5
  • 리스트에는 다양한 값들을 혼합해서 저장할 수 있다. 리스트 안에 리스트를 중첩하는 것이 가능하다.
list(a=list(val=c(1, 2, 3)), b=list(val=c(1, 2, 3, 4)))
# $a
# $a$val
# 1 2 3

# b
# $b$val
# 1 2 3 4

4.2 리스트내 데이터 접근 

  • 데이터는 '리스트 변수명$키'와 같이 접근한다. 또는 각 요소를 순서대로 '리스트변수[[인덱스]]'와 같이 접근할 수도 있다. 
x <- list(name="foo", height=c(1, 3, 5))
x$name # "foo"
x$height # 1 3 5
x[[1]] # "foo"
x[[2]] # 1 3 5
  • '[인덱스]'의 형태는 각 값이 아니라 '(키, 값)'을 담고 있는 서브 리스트를 반환한다. 
x[1]
# $name
# "foo"
x[2]
# $height
# 1 3 5

chapter03-1.R
0.00MB

댓글