본문 바로가기

R/R을 이용한 데이터 처리&분석 실무

스칼라

반응형

이 절에서는 스칼라(scalar) 데이터 타입에 관해 살펴본다. 스칼라란 단일 차원의 값을 뜻하는 것으로 숫자 1,2,3,...을 예로 들 수 있다. 반면 좌표 평면 위에 있는 점인 (1,2)는 2차원 값이므로 이 절에서 설명하는 스칼라에 해당하지 않는다.

 

R에서 데이터 타입의 기본은 벡터(vector)다. 따라서 스칼라 데이터는 길이가 1인 벡터(즉, 길이가 1인 배열)와 같은 것으로 볼 수 있다.

 

숫자

정수, 부동소수 등을 숫자형 데이터 타입으로 지원한다. 다음은 a에 3, b에 4.5를 저장한 뒤 c에 a와 b의 합을 저장하고, c의 값을 출력한 예다. 값을 출력하려면 print() 함수를 다른 언어처럼 호출해 쓰거나 마지막 행에 보인 예와 같이 print() 없이 변수명을 그대로 입력하면 된다.

>a <- 3
>b <- 4,5
>c <- a+b
>print(c)
[1] 7.5
>c
[1] 7.5
>

 

NA

R과 다른 언어의 가장 큰 차이 중 하나가 바로 NA(Not Available) 상수다. NA는 데이터 값이 없음을 뜻한다. 예를 들어, 4명의 시험 점수가 있을 때 3명의 점수는 각각 80, 90, 75지만 4번째 사람의 점수를 모를 경우 NA를 이용해 4번째 사람의 점수를 표현한다.

>one <- 80
>two <- 90
>three <- 75
>four <- NA

 

변수에 NA값이 저장되어 있는지는 is.na()함수로 확인한다.

is.na(x)

NA가 저장되어 있으면 TRUE, 그렇지 않으면 FALSE를 반환한다.

 

예를 들어, 다음은 변수 four에 NA가 저장되어 있음을 확인하는 코드다.

>is.na(four)
[1] TRUE

 

NULL

NULL은 NULL 객체를 뜻하며, 변수가 초기화되지 않았을 때 사용한다. NULL은 NA와 구분해서 생각해야 한다. 어떤 변수에 NULL이 저장되어 있는지는 is.null()을 사용해 판단할 수 있다.

is.null(x)

반환 값은 NULL이 저장되어 있으면 TRUE, 그렇지 않으면 FALSE를 반환한다.

 

다음은 NULL을 변수에 저장하고 이를 is.null()로 확인하는 예이다.

>x <- NULL
>is.null(x)
[1] TRUE
>is.null(1)
[1]FALSE
>is.null(NA)
[1]FALSE
>is.na(NULL)
logical(0)
Warning message:
In is.na(NULL) : is.na() applied to non-(List or vecgtor) of type 'NULL'

 

Note. NULL과 NA의 차이

NA는 결측치, 즉 값이 빠져 있는 경우를 뜻한다. 결측치가 존재하는 이유로는 데이터 입력 중 실수로 값을 입력하지 않은 경우, 값을 어떤 이유로든 관찰되지 못한 경우(예를 들어, 인구 조사에서 특정 가구가 소득을 기재하지 않은 경우), 마지막으로 해당 항목에 적절한 값이 없어서 값이 입력되지 않은 경우(예를 들어, 약품의 냄새를 기록하고 있는 칸에서 특정 약품은 향이 없는 경우)를 들 수 있다.

 

반면 NULL은 프로그래밍의 편의를 위해 미정(undefined) 값을 표현하는 데 사용하는 개념이다. is_even이라는 변수에 a 변수의 값이 짝수면 TRUE, 홀수면 FALSE를 저장하는 다음 예를 보자.

 

is.even <- NULL
if (a가 짝수면) { is_even <- TRUE } else { is_even <- FALSE}

위 코드에서 if 조건문이 실행되기 전에는 is_even에 어떤 값을 줘야 할 지 알 수 없어 NULL로 초기화했다. 그리고 if 문을 지나면서 is_even에 적절한 값이 할당되었다. 이처럼 NULL은 변숫값이 아직 미정인 상태를 표현하는 목적으로 사용한다.

 

문자열

R에는 C 등의 언어에서 볼 수 있는 한 개 문자에 대한 데이터 타입(예를 들면, C의 char 데이터 타입)이 ㅇ벗다. 대신 문자열로 모든 것을 표현한다. 문자열은 'this_is_string' 또는 "this_is_string"과 같이 어느 따옴표로 묶어도 무관하다.

>a <- "hello"
>print(a)
[1] "hello"
>a <- 'hello'
>print(a)
[1] "hello"

 

진릿값

TRUE, T는 모두 참 값을 의미한다. FALSE, F는 거짓 값을 의미한다. 진릿값에는 &(AND), |(OR), !(NOT) 연산자를 사용할 수 있다.

>TRUE & TRUE
[1]TRUE

>TRUE & FALSE
[1]FALSE

 

>TRUE | TRUE
[1]TRUE

 

>TRUE | FALSE
[1]TRUE

 

>!TRUE
[1]FALSE

 

>!FALSE
[1]TRUE

 

좀 더 엄밀히 말하면 TRUE와 FALSE는 예약어(reserved word)고, T, F는 각각 TRUE와 FALSE로 초기화된 전역 변수다. 따라서 다음과 같이 T에 FALSE를 할당하는 것이 가능하다! 반면 TRUE는 예약어므로 FALSE를 할당할 수 없다. 이런 이유로 TRUE, FALSE 대신 T, F라는 축약 표현을 사용할 때는 주의가 필요하다(가능하면 T, F 대신 TRUE, FALSE를 명시적으로 사용하는 것이 좋다.)

>T <- FALSE
>FALSE <- TRUE
Error in TRUE <- FALSE : invalid (do_set) left-hand side to assignment

 

AND나 OR 연산자에는 &, | 외에도 &&와 ||가 있다. 이들의 차이점은 &, |는 진릿값이 저장된 벡터(배열)끼리 연살할 때 요소별로 계산을 한다는 점이다 예를 들어, 다음 코드에서는 TURE, TRUE가 저장된 벡터와 TRUE, FALSE가 저장된 벡터 간에 &(AND) 연산을 수행했다. 그 결과는 두 벡터의 첫 번째 요소끼리의 연산 결과는 TRUE && TURE = TRUE, 두번째 요소끼리의 연산 결과는 TRUE && FALSE = FALSE가 되었다.

>c(TRUE, TRUE) & c(TRUE, FALSE)
[1] TRUE FALSE

 

반면 &&는 벡터의 요소 간 계산을 하기 위함이 아니라 TRUE && TRUE 등의 경우와 같이 두 개의 진릿값끼리 연산을 하기 위한 연산자다. 이는 ||와 |의 경우에도 마찬가지다. 예를 들어, 다음 코드를 보면 한 개의 값만 반환됨을 볼 수 있다.

>c(TRUE, TRUE) && c(TRUE, FALSE)
[1] TRUE

 

이로 미루어보면 언제 &,|를 써야 하고 언제 &&, ||를 써야 하는지 명확해진다. &,|는 벡터의 저장된 진릿값 간에 논리 연산을 수행할 때 사용한다. &&,||는 한 개의 진릿값이 필요한 if 문 등에서 사용한다.

 

또 &&,||는 쇼트서킷(short-circuit)을 지원한다. 따라서 A&&B 현태의 코드가 있을 때 A가 TRUE라면 B도 평가하지만 A가 FALSE라면 B를 평가하지 않는다. 

 

언뜻 보기에는 &&나 ||를 &,|보다 많이 사용해야 할 것 같지만, R에서는 벡터 또는 리스트 내 요소를 한 번에 비교하는 연산이 많으므로 오히려 &나 |가 더 유용하다.

 

팩터

팩터(Factor)는 범주형(Categorical) 데이터(자료)를 표현하기 위한 데이터 타입이다.

 

범주형 데이터란 데이터가 사전에 정해진 특정 유형으로만 분류되는 경우를 뜻한다. 예를 들어, 방의 크기를 대, 중, 소로 나누어 기재하고 있을 때 특정 방의 크기를 '대'라고 적는다면 이 값은 범주형 데이터다. 이와 같이 범주형 변수가 담을 수 있는 값의 목록(이 예에서는 대, 중, 소)을 레벨(수준,level)이라고 한다. 따라서 범주형 데이터를 저장하는 데이터 타입인 팩터에는 관측된 값뿐만 아니라 관측 가능한 값의 레벨도 나열해야 한다.

 

범줗ㅇ 데이터는 또 다시 명목형(Norminal)과 순서형(Ordinal)으로 구분된다. 명목형 데이터는 값들 간에 크기 비교가 불가능한 경우를 뜻한다 예를 들어, 정치적 성향을 좌파, 우파로 구분하여 저장한 데이터는 명목형이다. 반면 순셔형 데이터는 대, 중, 소와 같이 값에 순서를 들 수 있는 경우를 말한다.

 

범주형 데이터에 상반하는 개념에는 수치형(Numerical) 데이터가 있다. 수치형 데이터는 값을 측정하거나 개수를 세는 경우와 같이 숫자로 나온 값을 의미한다. 예를 들어, 방의 크기를 30m^2, 28m^2와 같이 기록하는 경우나 학생들의 성적이 이에 해당한다.

 

팩터와 관련한 함수를 아래에 나열했다.

 

-facotr : 팩터 값을 생성한다.

 factor(x, levels, ordered)

 

-nlevels : 팩터에서 레벨의 개수를 반환한다.

nlevels(x)

 

-levels : 팩터에서 레벨의 목록을 반환한다.

levels(x)

 

-is.factor : 주어진 값이 팩터인지를 판단한다.

is.factor(x)

 

-ordered : 순서형 팩터를 생성한다.

ordered(x)

 

-is.ordered : 순서형 팩터인지를 판단한다.

is.ordered(x)

 

 

예를 들어, 성별을 팩터로 만드는 경우를 생각해보자. 성별은 범주형 데이터 중 명목형 데이터에 해당하며, "m"(남성)과 "f"(여성) 두 가지 값이 가능하다. 따라서 남성을 저장한 변수 sex를 다음과 같이 생성할 수 있다.

>sex <- factor("m", c("m","f"))
>sex
[1] m
Levels: m f

 

위 코드에서 sex에는 "m"이 저장되었고, 이 팩터가 담을 수 있는 값의 레벨은 "m", "f"로 제한되었다. c()는 다음에 설명할 벡터를뜻하며, c("m", "f")는 쉽게 "m", "f"가 저장된 배여로 생각하면 된다.

 

팩터 변수는 nlevels()로 레벨의 수를 알 수 있고, levels()로 레벨의 목록을 볼 수 있다.

>nlevels(sex)
[1]2
>levels(sex)
[1] "m", "f"

 

levels()의 반환 값은 벡터며, 벡터는 다른 언어의 배열처럼 사용할 수 있다. 따라서 각 레벨의 ㄱ밧을 다음과 같이 구할 수 있다. R에서 색인(인덱스)은 0이 아닌 1부터 시작한다는 점에 유의하기 바란다.

>levels(sex)[1]
[1]"m"
>levels(sex)[2]
[1]"f"

 

팩터 변수에서 레벨 값을 직접 수정하고자 한다면 levels()값을 할당하면 된다. "m"을 "male"로, "f"를 "female"로 바꿔보자.

>sex
[1]m
Levels: m f
>levels(sex) <- c("male", "female")
>sex
[1] male
Levels : male female

 

여러 개의 값을 팩터로 만들고자 한다면 factor()의 인자 x에 벡터를 지정한다.

>factor(c("m", "m", "f"), c("m", "f"))
[1] m m f
Levels: m f

 

levels 인자를 생략하면 데이터로부터 자동으로 레벨의 목록을 파악한다.

>factor(c("m", "m", "f"))
[1] m m f 
Levels: f m

 

factor()는 기본적으로 데이터에 순서가 없는 명목형 데이터를 만든다. 순서형 데이터를 원한다면 ordered()를 사용하거나 factor() 호출 시 ordered=TRUE를 지정한다.

>ordered("a", c("a","b","c"))
[1]a
Levels: a<b<c

 

 앞서와 달리 'Levels:'에 순서가 'a<b<c'로 표시되어 있음을 볼 수 있다.

 

 

 

 

 

R을 이용한 데이터 처리&분석 실무 中

반응형

'R > R을 이용한 데이터 처리&분석 실무' 카테고리의 다른 글

타입 판별, 타입변환  (0) 2020.01.29
데이터 프레임  (0) 2020.01.29
리스트  (0) 2020.01.28
벡터  (0) 2020.01.28
변수  (0) 2020.01.27