R 기본 데이터 타입과 구조 완벽 이해 (문자, 숫자, 논리)

R을 처음 배울 때 가장 먼저 완벽히 이해하고 넘어가야 하는 핵심 개념이 바로 데이터 클래스(Data Class, 자료형)입니다. R은 통계 분석과 데이터 처리에 극도로 최적화된 전문 언어이기 때문에, 초보자가 입력하는 동일한 형태의 정보라 할지라도 내부적으로 ‘숫자’인지, ‘문자’인지, 아니면 ‘참/거짓’인지에 따라 같은 함수를 쓰더라도 그 결과가 완전히 다른 방향으로 작동하게 됩니다.

오늘은 데이터 과학의 가장 밑바탕인 핵심 데이터 타입 4가지(숫자, 문자, 논리, 날짜)의 특징과 더불어, 실무에서 마주하는 지저분한 데이터를 내가 원하는 형태로 자유자재로 변환(강제 형변환)하는 방법에 대해 최신 R 생태계 실전 노하우를 버무려 빠르게 정리해보겠습니다.

1. 숫자형 (Numeric) 데이터

R에서 사용하는 가장 거대한 범주의 일반적인 숫자 저장 구조입니다. 소수점이 있는 실수형(Double) 데이터를 기본으로 통칭한다고 생각하면 이해가 빠릅니다. 평균 계산 등 사칙연산의 근간입니다.

x <- 10
y <- 3.14
x; y
> [1] 10
> [1] 3.14
class(x)
> [1] "numeric"

만약 머신러닝 패키지나 딥러닝(Keras, Torch)의 텐서 구조 등 특별한 메모리 활용 상황에서 그냥 numeric(실수)이 아닌 절대적인 정수(Integer)임을 명확히 컴퓨터 엔진에게 알려줘야 할 때는 숫자 뒤에 대문자 L(Long integer에서 유래)을 의도적으로 접미사로 붙여줍니다.

x <- 1L
class(x)
> [1] "integer"

(다만 일반적으로 R을 활용한 전통적 통계 분석이나 엑셀 전처리 작업에서는 정수형과 실수형을 굳이 메모리 단위까지 구분하지 않고 numeric으로 편하게 사용해도 무방합니다.)

💡 프로의 분석 도구: `typeof()` vs `class()`
내부적으로 이 자료형이 메모리에 어떻게 저장되어 있는지 밑바닥 원소재를 알려주는 것이 typeof()이고, 겉으로 어떻게 포장해서 보여줄까를 결정하는 고수준 객체가 class()입니다. 데이터 타입 에러를 추적할 땐 typeof()를 써보면 진범을 더 쉽게 잡을 수 있습니다!

2. 문자형 (Character) 데이터

명목형 변수나 자연어 텍스트 문장을 나타낼 때 사용하는 자료형이며, 반드시 영문 쌍따옴표(")나 홑따옴표(') 양쪽으로 내용을 완벽히 감싸서 입력해야 문자형으로 인식됩니다.

a <- "Hello, world!"
b <- 'R programming'
a; b
> [1] "Hello, world!"
> [1] "R programming"
class(a)
> [1] "character"

3. 논리형 (Logical) 데이터

데이터 전처리 과정에서 이상치 제거, 필터링(조건 검색) 시 가장 핵심적으로 쓰이는 불리언(Boolean) 타입입니다. TRUE(참, 또는 T)와 FALSE(거짓, 또는 F) 오직 직관적인 두 가지 값만 존재합니다.

p <- TRUE
q <- FALSE

class(p)
> [1] "logical"

💡 꿀팁: 논리형 데이터를 수학 연산하면 어떻게 될까?
논리형 데이터는 겉보기엔 문자 같지만, 따옴표 없이 입력되는 시스템 약속 키워드입니다. 만약 TRUEFALSE를 사칙연산이나 통계 함수 수식에 밀어넣어버리면 시스템 내부적으로 TRUE는 1, FALSE는 0으로 자동 임시 변환되어 계산됩니다.
따라서 조건문에서 sum(조건) 형태로 사용해주면 조건을 만족하는 갯수를 손쉽게 카운트 할 수 있는 엄청난 스킬이 됩니다. (예: TRUE + TRUE의 결과는 2)

4. 날짜 및 시간 (Date / POSIXct) 데이터

금융 데이터 등 시계열 분석을 할 때 필수적인 날짜와 시간 클래스입니다. 엑셀과 달리 R에서는 기본적으로 사용자가 막 입력한 문자를 단순 텍스트로 인식합니다. 고로 이를 as.Date() 등 전용 함수를 통해 ‘진짜 시공간의 흐름을 갖는 날짜 메타데이터’로 변환해 주어야만 시차 연산이 가능합니다.

date <- as.Date("2023-03-31")
date + 1
> [1] "2023-04-01"
class(date)
> [1] "Date"

날짜뿐만 아니라 ‘시간(Time)’ 초점까지 함께 민감하게 다루려면 초단위 기준이 있는 POSIXct 형태를 주로 씁니다. 최근 실무에서는 기본 제공 함수들의 복잡성을 피하기 위해 문자열 기반 파싱을 혁신한 lubridate 패키지(예: ymd_hms() 함수)가 산업 표준(Standard)으로 완전히 자리를 잡은 상태입니다.

datetime <- as.POSIXct("2022-02-22 10:30:00")
class(datetime)
> [1] "POSIXct" "POSIXt" 

(참고: tz 옵션을 주어 tz="Asia/Seoul" 처럼 지역의 타임존(Timezone)을 명확하게 셋팅할 수도 있습니다. 서버와 로컬의 시간 충돌을 이 옵션으로 막을 수 있습니다.)

5. 데이터 클래스 자유자재로 강제 형변환하기 (as계열 함수)

외부 CSV, 엑셀 작업을 수입/출력 하다 보면, 명백한 숫자 데이터들이 공백이나 콤마(,) 찌꺼기 하나 때문에 통째로 문자형으로 잘못 치환되어 들어오는 경우가 실무에서 허다합니다. 이때는 as.타입명() 류의 함수들을 강제로 활용해 해당 열의 데이터 성질을 즉시 덮어씌워버릴 수 있습니다.

x <- 10             # 기본 숫자형 (numeric)
y <- as.character(x)# 숫자를 문자로 강제 변환
y
> [1] "10"
z <- as.numeric(y)  # 문자를 다시 숫자로 변환
z
> [1] 10

마치며

R에서는 이처럼 가장 근간 단위가 되는 데이터 클래스(자료형)들을 모아서, 점차 거대한 형태의 차원을 지닌 데이터 조립 구조를 만들어냅니다. 오늘 배운 문자, 숫자, 논리 요원들이 하나씩 뭉쳐 1차원의 벡터(Vector), 그리고 모든 타입을 다 포용하는 리어카인 리스트(List), 그리고 우리가 사랑하는 엑셀 표의 궁극적 형태인 데이터프레임(Data Frame)으로 승급하게 되는 것이죠.

이 기본 클래스의 특성과 변환 개념(as 계열)을 꼭 숙지해 두시면, 추후 크롤링 데이터 분석이나 요상한 에러 대처를 할 때 아주 든든한 밑거름이 될 것입니다!


당신이 좋아할 만한 콘텐츠

by Google Adsense


관련 글 보기