개발 이야기/R

[R][Tutorial] R 초보자를 위한 튜토리얼 데이터 타입 및 구조

혁진 2025. 4. 18. 16:34

R을 너무 오랜만에 쓰는 관계로 간단하게 아래의 튜토리얼을 따라해보려고한다. 

https://misdb.github.io/R/R-Tutorial/

 

index

초보자를 위한 R 튜토리얼 요약 R은 데이터 과학자나 구글, 에어비엔비, 페이스북 등과 같은 주요 기업들이 데이터 분석을 위해 널리 이용하고 있는 프로그램 언어이다. 이 사이트는 초보자를 위

misdb.github.io

 

R 프로그램

R은 통계계열에서 많이 사용하는 언어로 1993년에 Ross Ihaka와 Robert Gentleman이 개발하였다. R은 광범위한 통계와 그래픽 메소드(method)를 보유하고 있다. 기계학습 알고리즘, 선형 회귀분석, 시계열 분석, 통계적 추론 등과 같은 몇 가지 예를 들 수 있다. 

R 데이터 타입

데이터 타입은 복잡하게 생각하지 말고 아래의 3개 numeric, char, logical(bool)이 존재한다고 생각하면되다. 

x = 3       # numeric (double)
y = "hi"    # character
z = TRUE    # logical확인

 

Vector와 List

Vector의 경우 c()를 이용한다.

v <- c(1, 2, 3)          # numeric vector
typeof(v)               # "double"

 

List의 경우 list()를 이용한다. 

lst <- list(1, "a", TRUE)
typeof(lst)         # "list"
str(lst)            # List of 3: num 1, chr "a", logi TRUE

 

이때 둘의 차이점은 list의 경우 여러 데이터타입을 담을 수 있다는 것이다. 

결국 vector는 np.array랑 비슷하다고 생각하면된다.

범주형 변수 factor

범주형변수의 경우 factor를 이용한다. 

Factor의 경우 다음과 같이 사용한다. 

gender <- factor(c("male", "female", "male", "female"))
gender
# [1] male   female male   female
# Levels: female male

 

내부적으로 숫자와 level의 구조로 되어있다. 

즉 숫자는 각 데이터들이 어느 범주에 속하는지를 나타내며, levels는 그 숫자들이 무얼 의미하는지를 담는다. 

as.integer(gender)     # [1] 2 1 2 1
levels(gender)         # [1] "female" "male"

 

기본적으로 범주는 order가 없지만 order가 존재하는 경우, order ture옶션을 주면 된다. 

grade <- factor(c("B", "A", "C", "B"),
                levels = c("C", "B", "A"),
                ordered = TRUE)
grade[1] > grade[3]   # TRUE (B > C)

 

마지막으로 factor의 값들을 불러올때, 바로 as.numeric을 하면 레벨의 인덱스들을 불러오기에 실제 값을 불러오려면 char로 변환하고 numeric으로 다시 변환하자. 

f <- factor(c("100", "200", "300"))

as.numeric(f)                 # [1] 1 2 3 ❌ 잘못된 변환
as.numeric(as.character(f))  # [1] 100 200 300 ✅ 올바른 변환

 

Matrix

Matrix의 경우 다음과 같이 정의한다.

matrix(data, nrow, ncol, byrow = FALSE)

 

이때 인자의 경우 

  • data: 행렬의 행과 열에 정렬될 요소들의 집합.
  • nrow: 행의 수
  • ncol: 열의 수
  • byrow: 행 우선으로 데이터가 왼쪽에서 오른쪽 방향으로 채워진다. 열 우선으로 행렬의 값을 채우고 싶다면 즉, 데이터가 열 우선으로 위에서 아래로 채워지게 하고 싶다면 byrow = FALSE (기본 값)를 사용한다.이다. 
# 2행 3열 행렬 (by column이 기본)
m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 3)
print(m)
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

 

행렬에 행추가나 열추가의 경우 rbind(), cbind()를 이용한다. 

 

Dataframe: matrix형태지만 다른 타입이 가능

특징 matrix data.frame
타입 통일 여부 ✅ 모든 원소 같은 타입 (numeric 등) ❌ 열마다 다른 타입 가능
내부 구조 atomic vector + dim 속성 리스트 (각 열이 벡터)
사용 목적 수치 계산, 행렬 연산 통계 분석, 데이터 처리
열 이름 colnames() names() 또는 colnames()
행 이름 rownames() rownames()
출력 형태 깔끔한 배열 테이블 느낌, 열 이름 출력
엑셀 같은 데이터

 

dataframe의 경우 표에서 나타난것처럼 matrix형태지만 열마다 다른타입이 가능하다(이는 기존 python에서 다룬것과 유사)

df <- data.frame(
  name = c("Alice", "Bob", "Charlie"),
  age = c(25, 30, 28),
  student = c(TRUE, FALSE, TRUE)
)

 

구조는 다음과 같이 str로 확인가능. 

str(df)
# 'data.frame':	3 obs. of  3 variables:
# $ name   : chr  "Alice" "Bob" "Charlie"
# $ age    : num  25 30 28
# $ student: logi  TRUE FALSE TRUE

 

주의할 점은 data.frame의 경우 문자열은 자동으로 factor로 변환하는 경우가 있기에 이를 주의하자. 

data.frame(name = c("a", "b"), stringsAsFactors = FALSE)

 

데이터프레임에 열을 추가하려면 다음과 같이 $를 이용해 새로운 변수와 함께 추가하자. 

# Create a new vector
quantity <- c(10, 35, 40, 5)
​
# Add `quantity` to the `df` data frame
df$quantity <- quantity
df

 

행을 추가하는 경우 rbind()를 이용하자

# 기존 데이터프레임
df <- data.frame(name = c("Alice", "Bob"), age = c(25, 30))

# 추가할 행 (벡터 또는 data.frame 형태)
new_row <- data.frame(name = "Charlie", age = 28)

# 행 추가
df <- rbind(df, new_row)

#or vector로 추가
new_row <- c("David", 22)
df <- rbind(df, new_row)

 

반복추가인 경우 다음처럼 list를 받는 do.call를 이용하다. 

rows <- list()
rows[[1]] <- data.frame(name = "Eve", age = 21)
rows[[2]] <- data.frame(name = "Frank", age = 26)

df <- rbind(df, do.call(rbind, rows))

 

do.call의 경우 함수 호출을 리스트로 표현된 인자들로 실행하는 함수이다.