2.2 스칼라(scalar)

  • 단일 차원의 값(하나의 값): \(1 \times 1\) 백터로 표현 \(\rightarrow\) R 데이터 객체의 기본은 벡터!!
  • 데이터 객체의 유형은 크게 숫자형, 문자열, 논리형이 있음
스칼라를 입력시 R의 벡터 지정 함수인 c()(벡터 부분에서 상세 내용 학습)를 꼭 사용해서 입력할 필요가 없다. 단, 연속되지 않은 두 개 이상 스칼라면 벡터이므로 꼭 c()를 써야 한다.

2.2.1 선언

  • 일반적으로 컴파일이 필요한 언어(예: C 언어)의 경우 변수 또는 객체를 사용 전에 선언이 필요
int x; 
x = 1;

  • 위 코드에서 int x; 없이 x = 1을 입력 후 컴파일 하면 에러가 나타나지만 R 언어에서는 변수를 선언할 필요가 전혀 없음

  • z 가 어떤 데이터 타입인지 언급할 필요가 전혀 없음 \(\rightarrow\) Python, Perl, Matlab 등과 같은 스크립트 언어의 특징. 아래 코드 참조

z <- 3
z
[1] 3

2.2.2 숫자형

  • 정수형(integer)과 실수형(double)로 구분됨
  • 정수형 구분시 숫자 뒤 L을 표시
# 정수형 구분자 사용 예시
# typeof(): R 객체의 데이터 타입 반환하는 함수
typeof(10L)
[1] "integer"
typeof(10)
[1] "double"

  • 수치연산(+, -, *, ^, **, /, %%, %/%) 가능: R은 함수형 언어이기 때문에 앞에 기술한 연산자도 하나의 함수로 인식함.
  • 수치 연산자(operator) 및 기본 수학 함수
Table 2.2: R언어의 기본 수치 연산자
수치형 연산자 설명
+, -, *, / 사칙연산
n %% m n을 m 으로 나눈 나머지
n %/% m n을 m 으로 나눈 몫
n ^ m 또는 n ** m n 의 m 승

숫자형 스칼라 연산 적용 예시

# 숫자형 스칼라
a <- 3
b <- 10
a; b
[1] 3
[1] 10
# 덧셈
c <- a + b
c
[1] 13
# 덧셈을 함수로 입력
# "+"(a, b)로 입력한 결과
c <- "+"(a, b)

# 뺄셈
d <- b - a
d
[1] 7
# 곱셈
m <- a * b
m
[1] 30
# 나누기
dd <- b/a
dd
[1] 3.333333
# 멱승
b^a
[1] 1000
# 나누기의 나머지(remainder) 반환
r <- b %% a
r
[1] 1
# 나누기의 몫(quotient) 반환
q <- b %/% a
q
[1] 3
# 연산 우선 순위
nn <- (3 + 5)*3 - 4**2/4
nn
[1] 20

2.2.3 문자형

  • 수치형이 아닌 문자 형식의 단일 원소
  • C와 같은 언어에서 볼수 있는 한개 문자에 대한 데이터 타입 존재하지 않음
  • 수치연산 불가능
  • 따옴표(" 또는 ')로 문자를 묶어서 문자열 표시
  • 문자열을 다루는 자세한 설명은 5주차에서 자세히 설명할 예정임
h1 <- c("Hello CNU!!")
h2 <- c("R is not too difficult.")
typeof(h1); typeof(h2)
[1] "character"
[1] "character"
h1
[1] "Hello CNU!!"
h2
[1] "R is not too difficult."
# 문자열의 문자 수 반환
nchar(h1); nchar(h2)
[1] 11
[1] 23
# 문자열 연산 error 예시
h1 - h2
Error in h1 - h2: 이항연산자에 수치가 아닌 인수입니다

2.2.4 논리형 스칼라

  • 참(TRUE, T) 또는 거짓(FALSE, F)를 나타내는 값
  • TRUE/FALSE: 예약어(reserved word)
  • T/F: TRUEFALSE로 초기화된 전역 변수
    • TFALSE 또는 어떤 값도 할당 가능 \(\rightarrow\) 가급적 TRUE/FALSE를 명시하는 것이 편함
  • 논리형 연산자(logical operator)
Table 2.3: R언어의 논리형 연산자
논리형 연산자 설명
& AND (vectorized)
&& AND (atomic)
| OR (vectorized)
|| OR (atomic)
! NOT

  • 비교 연산자를 적용할 경우 논리값을 반환
Table 2.4: R언어의 비교 연산자
비교 연산자 설명
> 크다(greater-than)
< 작다(less-than)
== 같다(equal)
>= 크거나 같다(greater than equal)
<= 작거나 같다(less than equal)
!= 같지 않다(not equal)
Note:
기술한 비교 연산자는 수치형 및 논리형 데이터 타입 모두에 적용 가능 하지만, 문자형 비교 연산은 ==, != 만 가능함

참고

  • 논리형 스칼라도 숫자형 연산 가능 \(\rightarrow\) 컴퓨터는 TRUE/FALSE를 1과 0 숫자로 인식
  • 수치 연산자는 스칼라 뿐 아니라 아래에서 다룰 벡터, 행렬, 리스트, 데이터프레임 객체의 연산에 사용 가능
  • &/|&&/||는 동일하게 AND/OR를 의미하지만 연산 결과가 다름.
  • &의 연산 대상이 벡터인 경우 백터 구성 값 각각에 대해 & 연산을 실행 하지만 &&는 하나의 값(스칼라)에만 논리 연산이 적용(아래 예시 참고)

  • 논리형 스칼라의 논리 및 비교 연산 예시
typeof(TRUE)  # TRUE의 데이터 타입
[1] "logical"
TRUE & TRUE  # TRUE 반환
[1] TRUE
TRUE & FALSE  # FALSE 반환
[1] FALSE
# 아래 연산은 모두 TRUE 반환
TRUE | TRUE
[1] TRUE
TRUE | FALSE
[1] TRUE
# TRUE와 FALSE의 반대
!TRUE
[1] FALSE
!FALSE
[1] TRUE
# 전역변수 T에 FALSE 값 할당
T <- FALSE
T
[1] FALSE
T <- TRUE  # 원상복귀
# TRUE/FALSE에 값을 할당할 수 없음
TRUE <- 1
Error in TRUE <- 1: 대입에 유효하지 않은 (do_set) 좌변입니다
TRUE <- FALSE
Error in TRUE <- FALSE: 대입에 유효하지 않은 (do_set) 좌변입니다
# &(|)와 &&(||)의 차이
l.01 <- c(TRUE, TRUE, FALSE, TRUE)  # 논리형 값으로 구성된 벡터
l.02 <- c(FALSE, TRUE, TRUE, TRUE)
l.01 & l.02  # l.01과 l.02 각 원소 별 & 연산
[1] FALSE  TRUE FALSE  TRUE
l.01 && l.02  # l.01과 l.02의 첫 번째 원소에 대해 & 연산
Error in l.01 && l.02: 'length = 4' in coercion to 'logical(1)'
# 비교 연산자
x <- 9
y <- 4
# x > y 의 반환값 데이터 타입
typeof(x > y)
[1] "logical"
# 논리형 값 반환
x > y
[1] TRUE
x < y
[1] FALSE
x == y
[1] FALSE
x != y
[1] TRUE

2.2.5 결측값(missing value)

  • 결측치 지정 상수: NA \(\rightarrow\) R과 다른 언어의 가장 큰 차이점 중 하나
  • 예를 들어 4명의 통계학과 학생 중 3명의 통계학 개론 중간고사 점수가 각각 80, 90, 75점이고 4번 째 학생의 점수가 없는 경우 NA로 결측값 표현
  • is.na() 함수를 이용해 해당 값이 결측을 포함하고 있는지 확인
one <- 80; two <- 90; three <- 75; four <- NA
four
[1] NA
# 'is.na()' 결측 NA가 포함되어 있으면 TRUE 
is.na(four)
[1] TRUE

is.na(object_name): 객체를 구성하고 있는 원소 중 NA를 포함하고 있는지 확인 \(\rightarrow\) NA를 포함하면 TRUE, 아니면 FALSE 반환

참고: 자료에 NA가 포함된 경우 연산 결과는 모두 NA가 반환

NA + 1
[1] NA
NA & TRUE
[1] NA
NA <= 3
[1] NA

2.2.6 NULL 값

  • NULL: 초기화 되지 않은 변수 또는 객체를 지칭함
  • is.null() 함수를 통해 객체가 NULL인지 판단
x <- NULL # NULL 지정
is.null(x) # NULL 객체인지 판단
[1] TRUE
x <- 1
is.null(x) 
[1] FALSE

NANULL의 차이점: 자료의 공백을 의미한다는 점에서 유사한 측면이 있으나 아래 내용처럼 큰 차이가 있음

  • NULL: 값을 지정하지 않은 객체를 표현하는데 사용. 즉 아직 변수 또는 객체의 상태가 아직 미정인 상태를 나타냄
  • NA: 데이터 값이 결측임을 지정해주는 논리형 상수

# NA와 NULL은 다름
x <- NA
is.null(NA)
[1] FALSE
is.na(NULL)
logical(0)

2.2.7 무한대/무한소/숫자아님

  • Inf: 무한대(\(+\infty\), \(1/0\))
  • -Inf: 무한소(\(-\infty\), \(-1/0\))
  • NaN: 숫자아님(Not a Number, \(0/0\))
  • is.finite(), is.infinite(), is.nan() 함수를 통해 객체가 Inf 또는 NaN을 포함하는지 확인
x <- Inf
is.finite(x)
[1] FALSE
is.infinite(x)
[1] TRUE
x <- 0/0
is.nan(x)
[1] TRUE
is.infinite(x)
[1] FALSE

지금까지 요인형(factor)을 제외하고 R 언어에서 객체가 가질 수 있는 데이터 유형에 대해 알아봄. 요인형은 “2.7절 R 자료형: 요인과 테이블”에서 상세하게 배울 예정임.