이번 글에서는 저번 글에 이어 R의 변수와 데이터 타입 및 구조에 대해 이어 내용을 설명하려고 합니다.
저번 글에서는 데이터 구조 중에서 벡터까지 설명을 했으며, 이번 글에서는 리스트, 행렬과 데이터프레임에 대한 설명이 이루어질 예정입니다.
R의 데이터 종류(구조)
R에서는 다양한 데이터 구조가 있으며, 각 구조는 특정 형태로 데이터를 저장하는 방법을 제공합니다.
리스트 (List)
R에서 가장 유연하고 강력한 데이터 구조 중 하나로, 서로 다른 데이터 타입을 가진 객체들을 하나의 구조 안에 저장할 수 있는 1차원 데이터 구조입니다.
리스트는 벡터와 달리 각 요소가 서로 다른 데이터 타입을 가질 수 있으며, 이러한 요소들은 숫자, 문자, 논리형, 벡터, 행렬, 데이터 프레임 등 다양한 R 객체일 수 있습니다.
리스트의 생성
리스트는 list() 함수를 사용하여 생성합니다. 리스트의 각 요소는 이름을 가질 수도 있고, 가질 필요도 없습니다.
# 기본 리스트 생성
my_list <- list(1, "apple", TRUE)
print(my_list)
# 출력: [[1]]
# [1] 1
#
# [[2]]
# [1] "apple"
#
# [[3]]
# [1] TRUE
# 이름을 가진 리스트 생성
named_list <- list(number = 1, fruit = "apple", logic = TRUE)
print(named_list)
# 출력: $number
# [1] 1
#
# $fruit
# [1] "apple"
#
# $logic
# [1] TRUE
리스트의 인덱싱과 요소 접근
리스트의 요소에 접근하기 위해서는 [[ ]] 또는 $를 사용합니다.
- [[ ]]를 사용하면 인덱스나 이름으로 특정 요소에 접근할 수 있습니다.
- $는 이름으로만 접근할 수 있으며, 편리하게 사용할 수 있는 방법입니다.
# 리스트의 첫 번째 요소 접근
my_list[[1]]
# 출력: 1
# 이름으로 접근
named_list$fruit
# 출력: "apple"
# 리스트의 여러 요소를 추출할 때는 `[ ]`를 사용합니다. 이 경우 반환되는 것은 여전히 리스트입니다.
sub_list <- my_list[1:2]
print(sub_list)
# 출력: [[1]]
# [1] 1
#
# [[2]]
# [1] "apple"
리스트의 수정과 확장
리스트는 동적으로 수정하거나 확장할 수 있습니다.
- 요소 수정: 기존 리스트의 특정 요소를 수정할 수 있습니다.
- 요소 추가: 새로운 요소를 추가할 수 있습니다.
my_list[[2]] <- "banana"
print(my_list)
# 출력: [[1]]
# [1] 1
#
# [[2]]
# [1] "banana"
#
# [[3]]
# [1] TRUE
my_list[[4]] <- 3.14
print(my_list)
# 출력: [[1]]
# [1] 1
#
# [[2]]
# [1] "banana"
#
# [[3]]
# [1] TRUE
#
# [[4]]
# [1] 3.14
리스트의 결합
리스트를 결합할 때는 c() 함수를 사용하여 여러 리스트를 하나로 합칠 수 있습니다.
list1 <- list(1, 2, 3)
list2 <- list("a", "b", "c")
combined_list <- c(list1, list2)
print(combined_list)
# 출력: [[1]]
# [1] 1
#
# [[2]]
# [1] 2
#
# [[3]]
# [1] 3
#
# [[4]]
# [1] "a"
#
# [[5]]
# [1] "b"
#
# [[6]]
# [1] "c"
행렬 (Matrix)
R에서 동일한 데이터 타입을 가진 원소들로 이루어진 2차원 배열입니다. 행렬은 주로 수치 데이터나 데이터를 행과 열로 구조화하여 분석할 때 사용됩니다.
행렬은 matrix() 함수를 사용하여 생성되며, 행과 열의 개수를 지정해 데이터가 어떻게 배열될지 정의합니다.
행렬의 생성
행렬은 matrix() 함수를 사용하여 생성합니다.
# 숫자 1부터 9까지의 데이터를 가진 3x3 행렬 생성
my_matrix <- matrix(1:9, nrow = 3, ncol = 3)
print(my_matrix)
# 출력:
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
주요 매개변수:
- data: 행렬에 채울 데이터를 지정합니다. 이 데이터는 벡터로 제공되며, 순서대로 행렬에 채워집니다.
- nrow: 행의 개수를 지정합니다.
- ncol: 열의 개수를 지정합니다.
- byrow: TRUE로 설정하면 행을 우선으로 데이터가 채워집니다. 기본값은 FALSE로, 열을 우선으로 채워집니다.
행렬의 속성
- 차원 확인: dim() 함수를 사용하여 행렬의 차원을 확인할 수 있습니다.
- 행의 개수와 열의 개수: 각각 nrow()와 ncol() 함수를 사용하여 행과 열의 개수를 확인할 수 있습니다
- 행렬의 길이: length() 함수는 행렬의 총 요소 개수를 반환합니다.
dim(my_matrix)
# 출력: 3 3
nrow(my_matrix)
# 출력: 3
ncol(my_matrix)
# 출력: 3
length(my_matrix)
# 출력: 9
행렬의 인덱싱과 슬라이싱
행렬의 특정 요소에 접근하거나, 행 또는 열을 선택할 때는 대괄호 [ ]를 사용합니다. 인덱스는 [행, 열] 형태로 지정됩니다.
# 행렬의 첫 번째 행, 두 번째 열에 있는 요소에 접근
my_matrix[1, 2]
# 출력: 4
# 첫 번째 행 전체 선택
my_matrix[1, ]
# 출력: 1 4 7
# 두 번째 열 전체 선택
my_matrix[, 2]
# 출력: 4 5 6
# 특정 행과 열의 범위를 선택
my_matrix[1:2, 2:3]
# 출력:
# [,1] [,2]
# [1,] 4 7
# [2,] 5 8
행렬의 연산
행렬에서는 다양한 산술 연산이 가능합니다. R에서는 행렬 간의 덧셈, 뺄셈, 곱셈 등을 쉽게 수행할 수 있습니다.
- 행렬 간 덧셈 및 뺄셈: 동일한 차원의 행렬 간에는 요소별 덧셈과 뺄셈이 가능합니다.
matrix1 <- matrix(1:4, nrow = 2)
matrix2 <- matrix(5:8, nrow = 2)
sum_matrix <- matrix1 + matrix2
print(sum_matrix)
# 출력:
# [,1] [,2]
# [1,] 6 10
# [2,] 8 12
diff_matrix <- matrix2 - matrix1
print(diff_matrix)
# 출력:
# [,1] [,2]
# [1,] 4 4
# [2,] 4 4
- 행렬 곱셈: 행렬 간의 곱셈은 일반적으로 행렬 곱셈을 의미하며, %*% 연산자를 사용합니다.
prod_matrix <- matrix1 %*% matrix2
print(prod_matrix)
# 출력:
# [,1] [,2]
# [1,] 19 22
# [2,] 43 50
- 요소별 곱셈: 요소별 곱셈은 * 연산자를 사용하여 수행됩니다.
elementwise_prod <- matrix1 * matrix2
print(elementwise_prod)
# 출력:
# [,1] [,2]
# [1,] 5 21
# [2,] 12 32
- 전치 행렬: 행렬을 전치(Transpose)하려면 t() 함수를 사용합니다.
t_matrix <- t(my_matrix)
print(t_matrix)
# 출력:
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 7 8 9
행렬의 결합
행렬은 행 또는 열을 기준으로 결합할 수 있습니다. 이때 rbind()와 cbind() 함수를 사용합니다.
- 행 결합: rbind() 함수를 사용하여 행을 기준으로 행렬을 결합합니다.
- 열 결합: cbind() 함수를 사용하여 열을 기준으로 행렬을 결합합니다.
# 행 결합
matrix3 <- matrix(10:12, nrow = 1)
combined_by_row <- rbind(my_matrix, matrix3)
print(combined_by_row)
# 출력:
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
# [4,] 10 11 12
# 열 결합
matrix4 <- matrix(13:15, nrow = 3)
combined_by_column <- cbind(my_matrix, matrix4)
print(combined_by_column)
# 출력:
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 13
# [2,] 2 5 8 14
# [3,] 3 6 9 15
데이터 프레임 (Data Frame)
데이터프레임(Data Frame)은 R에서 가장 널리 사용되는 데이터 구조로, 행과 열로 이루어진 2차원 데이터 구조입니다. 데이터프레임은 주로 통계 분석, 데이터 조작 및 시각화 등 다양한 분석 작업에서 사용됩니다. 각 열은 벡터로 이루어지며, 서로 다른 데이터 타입을 가질 수 있습니다. 즉, 하나의 열은 숫자형 데이터를, 다른 열은 문자형 데이터를 포함할 수 있습니다.
데이터프레임의 생성
데이터프레임은 data.frame() 함수를 사용하여 생성할 수 있습니다.
# 예제 데이터프레임 생성
df <- data.frame(
id = 1:3,
name = c("Alice", "Bob", "Charlie"),
score = c(85.5, 90.0, 88.75),
passed = c(TRUE, TRUE, FALSE)
)
print(df)
# 출력:
# id name score passed
# 1 1 Alice 85.50 TRUE
# 2 2 Bob 90.00 TRUE
# 3 3 Charlie 88.75 FALSE
데이터프레임의 속성
- 차원 확인: dim() 함수를 사용하여 데이터프레임의 차원을 확인할 수 있습니다.
- 행의 개수와 열의 개수: 각각 nrow()와 ncol() 함수를 사용하여 확인할 수 있습니다.
- 열 이름: names() 함수나 colnames() 함수를 사용하여 열 이름을 확인할 수 있습니다.
- 행 이름: rownames() 함수를 사용하여 행 이름을 확인할 수 있습니다.
dim(df)
# 출력: 3 4 (3개의 행과 4개의 열)
nrow(df)
# 출력: 3
ncol(df)
# 출력: 4
names(df)
# 출력: "id" "name" "score" "passed"
rownames(df)
# 출력: "1" "2" "3"
데이터프레임의 인덱싱과 서브셋팅
데이터프레임에서 특정 요소, 행, 열에 접근하거나, 서브셋을 추출하는 방법은 벡터와 유사합니다.
- 특정 요소 접근: [행, 열] 형태로 특정 요소에 접근할 수 있습니다.
- 특정 행 또는 열 선택: 행이나 열을 지정하여 서브셋을 추출할 수 있습니다.
- 열 이름으로 접근: $를 사용하여 열 이름으로 데이터에 접근할 수 있습니다.
- 조건부 서브셋팅: 조건을 지정하여 특정 행을 선택할 수 있습니다.
# 특정 요소 접근
df[1, 2]
# 출력: "Alice" (1행 2열의 요소)
# 2번째 행 선택
df[2, ]
# 출력:
# id name score passed
# 2 2 Bob 90.0 TRUE
# "name" 열 선택
df[, "name"]
# 출력: "Alice" "Bob" "Charlie"
# 열 이름으로 접근
df$name
# 출력: "Alice" "Bob" "Charlie"
# 조건부 서브셋팅
# score가 88 이상인 행 선택
high_scores <- df[df$score >= 88, ]
print(high_scores)
# 출력:
# id name score passed
# 2 2 Bob 90.00 TRUE
# 3 3 Charlie 88.75 FALSE
데이터프레임의 수정 및 확장
데이터프레임은 동적으로 수정하거나 열과 행을 추가할 수 있습니다.
- 열 추가: 새로운 열을 추가할 수 있습니다.
df$grade <- c("B", "A", "B+")
print(df)
# 출력:
# id name score passed grade
# 1 1 Alice 85.50 TRUE B
# 2 2 Bob 90.00 TRUE A
# 3 3 Charlie 88.75 FALSE B+
- 행 추가: rbind() 함수를 사용하여 새로운 행을 추가할 수 있습니다.
new_row <- data.frame(id = 4, name = "David", score = 92, passed = TRUE, grade = "A")
df <- rbind(df, new_row)
print(df)
# 출력:
# id name score passed grade
# 1 1 Alice 85.50 TRUE B
# 2 2 Bob 90.00 TRUE A
# 3 3 Charlie 88.75 FALSE B+
# 4 4 David 92.00 TRUE A
- 열 이름 변경: names() 함수를 사용해 열 이름을 변경할 수 있습니다.
names(df)[2] <- "student_name"
print(df)
# 출력:
# id student_name score passed grade
# 1 1 Alice 85.50 TRUE B
# 2 2 Bob 90.00 TRUE A
# 3 3 Charlie 88.75 FALSE B+
# 4 4 David 92.00 TRUE A
데이터프레임의 결합
데이터프레임을 행이나 열 기준으로 결합할 수 있습니다.
- 행 결합: rbind() 함수를 사용하여 데이터프레임을 행 기준으로 결합합니다.
df2 <- data.frame(id = 5, student_name = "Eve", score = 87, passed = TRUE, grade = "B")
df <- rbind(df, df2)
print(df)
# 출력:
# id student_name score passed grade
# 1 1 Alice 85.50 TRUE B
# 2 2 Bob 90.00 TRUE A
# 3 3 Charlie 88.75 FALSE B+
# 4 4 David 92.00 TRUE A
# 5 5 Eve 87.00 TRUE B
- 열 결합: cbind() 함수를 사용하여 데이터프레임을 열 기준으로 결합합니다.
new_col <- data.frame(attendance = c(95, 100, 80, 90, 85))
df <- cbind(df, new_col)
print(df)
# 출력:
# id student_name score passed grade attendance
# 1 1 Alice 85.50 TRUE B 95
# 2 2 Bob 90.00 TRUE A 100
# 3 3 Charlie 88.75 FALSE B+ 80
# 4 4 David 92.00 TRUE A 90
# 5 5 Eve 87.00 TRUE B 85
데이터프레임의 활용
데이터프레임은 데이터 분석에서 필수적인 도구로, 다양한 데이터를 구조화하여 다루는 데 매우 유용합니다. 예를 들어, 요약 통계를 계산하거나, 특정 조건에 따라 데이터를 필터링하고, 그룹별로 데이터를 집계하는 작업 등에 사용됩니다.
- 요약 통계 계산 : summary() 함수는 데이터프레임의 각 열에 대해 요약 통계를 제공합니다.
- 그룹별 집계 : aggregate() 함수를 사용하여 데이터프레임의 데이터를 그룹별로 집계할 수 있습니다.
# 요약 통계 계산
summary(df)
# 그룹별 집계 : grade에 따라 score의 평균 계산
grade_avg <- aggregate(score ~ grade, data = df, FUN = mean)
print(grade_avg)
# 출력:
# grade score
# 1 A 91.0
이번 글에서는 리스트, 행렬, 데이터프레임에 대해 자세히 살펴보았습니다. 이 데이터 구조들은 R에서 데이터를 효율적으로 다루는 데 필수적인 도구들입니다. 다음 글에서는 배열(Array)과 팩터(Factor)와 같은 추가적인 데이터 구조를 다루며, R에서 제공하는 데이터 처리 기능을 더욱 깊이 이해해보도록 하겠습니다.
감사합니다!
'프로그래밍 언어 > R' 카테고리의 다른 글
06. R 프로그램에서 파일 읽기 및 쓰기 (0) | 2024.08.20 |
---|---|
05. R의 변수와 데이터 타입 및 구조 3️⃣ (array, 데이터 요약 및 시각화, 데이터 타입 확인 및 변환) (0) | 2024.08.17 |
03. R의 변수와 데이터 타입 및 구조 1️⃣ (변수와 데이터 타입, 팩터, 벡터) (0) | 2024.08.13 |
02. R package 기초 (0) | 2024.08.10 |
01. R의 기초 (R의 개념과 설치, R studio 설치) (1) | 2024.08.09 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!