[R][Tutorial] R 초보자를 위한 튜토리얼 데이터 타입 및 구조
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의 경우 함수 호출을 리스트로 표현된 인자들로 실행하는 함수이다.