티스토리 뷰

1. 배열의 정의

  • 배열( Array )은 행렬을 2차원 이상으로 확장시킨 객체를 의미
    • 2차원 구조로 이루어진 행렬도 일종의 배열이라고 할 수 있으며 일반적으로는 3차원 이상의 데이터 객체를 배열이라고 함
  • 배열의 주요 속성
    • length : 자료의 개수
    • mode : 자료의 형태
    • dim : 각 차원 벡터의 크기
    • dimnames : 각 차원 리스트의 이름

2. 배열의 생성

  • 배열을 생성하는데 사용되는 array( ) 함수를 이용하여 1에서 18까지의 원소를 갖는 3행 3열의 행렬 2개를 생성
#1~18까지의 자료 생성
# c(행의 개수, 열의 개수, 행렬의 개수)를 지정함으로써 원소의 개수를 제한
> arr <- array(1:24, c(3,3,2))

> dimnames(arr) <- list(paste("row", c(1:3)),paste("col",c(1:3)),paste("ar", c(1:2))) # 각 차원의
이름을 지정
> arr
, , ar 1
col 1 col 2 col 3
row 1 1 4 7
row 2 2 5 8
row 3 3 6 9
, , ar 2
col 1 col 2 col 3
row 1 10 13 16
row 2 11 14 17
row 3 12 15 18

> length(arr) # 자료의 개수 확인
[1] 18

> mode(arr) # 자료의 형태 확인
[1] "numeric"

> dim(arr) # 각 차원 벡터의 크기
[1] 3 3 2

> dimnames(arr) # 각 차원 리스트의 이름
[[1]]
[1] "row 1" "row 2" "row 3"
[[2]]
[1] "col 1" "col 2" "col 3"
[[3]]
[1] "ar 1" "ar 2"
  • 기본 함수
    • 배열은 행렬의 확장으로 기본적인 성질이 행렬과 유사
    • 배열을 생성하기 위한 대표적인 함수로는 아래와 같은 함수들이 있음
    • 예시
      • array(data, dim=c(행의 개수, 열의 개수, 행렬의 개수, … ), dim.names = NULL)
      • dim(x) ← c(행의 개수, 열의 개수, 행렬의 개수)

3. 배열의 생성 예시 1

  • ① array( ) 함수를 이용하여 1에서 6까지의 자료로 1차원 및 2차원 배열 을 생성해 보고 1에서 8까지 값으로 3차원 배열을 만들기
  • ② dim( ) 함수를 이용하여 1~24까지 자료로 3행 4열 행렬 2개를 생성
> array(1:6) #1~6의 자료로 1차원 배열 생성
[1] 1 2 3 4 5 6

> array(1:6, c(2,3)) #1~6의 자료로 2차원 배열 생성
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

> array(1:8, c(2,2,2)) #1~8의 자료로 3차원 배열 생성
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8

arr <- c(1:24) #1~24의 자료 생성
> dim(arr) <- c(3,4,2) # dim() 함수를 이용하여 3행 4열의 행렬 2개 생성
> arr
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24

4. 배열의 연산 예시 1

  • array() 함수를 이용하여 생성된 배열 간 연산
# 배열 생성
> ary1 <- array(1:8, dim = c(2,2,2))
> ary2 <- array(8:1, dim = c(2,2,2))

# 배열 조회
> ary1
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
#배열 조회
> ary2
, , 1
[,1] [,2]
[1,] 8 6
[2,] 7 5
, , 2
[,1] [,2]
[1,] 4 2
[2,] 3 1

# 배열의 덧셈
# 같은 자리의 원소끼리 덧셉 진행
> ary1 + ary2 
, , 1
[,1] [,2]
[1,] 9 9
[2,] 9 9
, , 2
[,1] [,2]
[1,] 9 9
[2,] 9 9

# 배열의 곱셈
# 같은 자리의 원소끼리 곱셈
> ary1 * ary2
, , 1
[,1] [,2]
[1,] 8 18
[2,] 14 20
, , 2
[,1] [,2]
[1,] 20 14
[2,] 18 8

> ary1 %*% ary2 #두 배열 # 원소들의 곱의 합
[,1]
[1,] 120
> sum(ary1 * ary2)
[1] 120

# 배열 원소의 추출/삭제
# 차례대로 행, 열, 행렬의 번호를 지정
> ary1[,,1] 
[,1] [,2]
[1,] 1 3
[2,] 2 4
> ary1[1,1,]
[1] 1 5
> ary1[1,,-2]
[1] 1 3

5. 리스트의 정의

  • 리스트는 서로 다른 형태( Mode )의 데이터로 구성된 객체를 의미
    • 행렬과 배열 등이 동일한 형태의 원소로 이루어진 객체인 반면 리스트를 구성하는 성분( Component )은 서로 다른 형태의 원소를 가질 수 있고, 길이도 다를 수도 있음
  • 리스트의 주요 속성
    • length : 자료의 개수
    • mode : 자료의 형태
    • names : 각 구성요소의 이름

6. 리스트의 생성 예시 1

  • list( ) 함수를 이용하여 두 개의 벡터와 한 개의 문자열을 가진 리스트를 생성하고 속성을 출력하는 예제
> a <- 1:10 # 원소 개수 : 10개
> b <- 11:15 # 원소 개수 : 5개

> klist <- list(vec1=a, vec2=b, descrip="example") # 리스트를 생성

> length(klist) # 리스트 klist의 자료의 개수
[1] 3 # vec1, vec2, descrip

> mode(klist) # 리스트 klist의 자료의 형태
[1] "list"

> names(klist) # 리스트 klist의 각 성분의 이름
[1] "vec1" "vec2" "descrip"

7. 리스트의 생성

  • 리스트를 생성하고 추출하는 방법은 행렬과 배열 등과 유사
    • 특정한 성분을 추출하거나 성분 내의 특정 원소를 추출하려면 아래와 같은 연산자를 사용
      • [[ ]] 를 사용하여 리스트에서의 성분을 추출
      • 성분의 이름이 부여되었다면 $ 연산자로 구분됨
      • [ ] 연산자를 사용하여 성분 내의 특정 원소를 추출

8. 리스트의 생성 예시 2

  • list( ) 함수를 이용하여 "A"라는 문자와 1에서 8까지의 원소를 갖는벡터를 성분으로 하는 list1이라는 리스트를 생성한 뒤,
  • list1의 세 번째 성분으로 논리값 T, F를 갖는 벡터를 추가하고 하고 두 번째 성분의 아홉 번째 원소로 9를 추가
> list1 <- list("A", 1:8) #list1 리스트 생성

# 리스트 조회
> list1
[[1]]
[1] "A"
[[2]]
[1] 1 2 3 4 5 6 7 8

> list1[[3]] <- list(c(T, F)) #세 번째 성분을 추가
> list1[[2]][9] <- 9 #두 번째 성분에 원소 추가

# 리스트 조회
> list1
[[1]]
[1] "A"
[[2]]
[1] 1 2 3 4 5 6 7 8 9
[[3]]
[[3]][[1]]
[1] TRUE FALSE

# 리스트 원소 삭제
> list1[3] <- NULL #세 번째 성분 삭제
> list1[[2]] <- list1[[2]][-9] #두 번째 성분의 9번째 원소 삭제
> list1
[[1]]
[1] "A"
[[2]]
[1] 1 2 3 4 5 6 7 8

9. 리스트의 생성 예시 3

  • 1에서 10까지의 원소를 갖는 벡터 a와 11에서 15까지의 원소를 갖는 벡터 b를 생성하고 “example”이라는 문자와 함께 nlist라는 리스트를 생성하기
# 벡터 a, b 생성
> a <- 1:10
> b <- 11:15 

> nlist <- list(vec1=a, vec2=b, descrip="example")
> nlist # a, b벡터 및 describe 변수에 example 문자 부여
$vec1
[1] 1 2 3 4 5 6 7 8 9 10
$vec2
[1] 11 12 13 14 15
$descrip
[1] "example"

> nlist[[2]][5] # 두 번째 성분 vec2의 다섯 번째 원소
[1] 15

> nlist$vec2[c(2,3)] # vec2의 두 번째와 세 번째 원소
[1] 12 13

10. 데이터 프레임의 정의

  • 행렬은 차원으로 표시되며 같은 형태의 객체를 가지는 반면, 데이터 프레임은 각 열들이 서로 다른 형태의 객체를 가질 수 있음
    • ① 데이터 프레임은 형태(mode)가 일반화된 행렬(matrix)
    • ② 데이터 프레임이라는 하나의 객체에 여러 종류의 자료가 들어갈 수 있음
    • ③ 데이터 프레임의 각 열은 각각 변수와 대응
    • ④ 분석이나 모형 설정에 적합한 자료 객체

11. 데이터 프레임의 기본 함수

  • 데이터 프레임의 주요 특징은 데이터의 입력과 저장에서 다룬 내용과 유사하며 생성하기 위해서는 다음과 같은 방법들이 사용됨
    • ① read.table( ) 함수를 이용하여 외부 텍스트 파일을 불러들이는 방법
      • ex ) read.table( file, header = FALSE, sep=””, … )
    • ② data.frame( ) 함수를 이용하여 여러 종류의 자료객체들을 서로 결합
      • ex ) data.frame(객체1, 객체2, …)
    • ③ as.data.frame( ) 함수를 사용하여 다른 형태의 자료객체를 데이터 프레임의 형태로 변환
      • ex ) as.data.frame(대상객체, …)
    • write.csv(대상객체, ..)와 write.table(대상객체, …)의 경우 데이터 프레임 저장 시 변수명 생성 방식에 차이가 있으므로 적절한 옵션을 지정해야 함에 유의

12. 데이터 프레임의 생성 예시 1

  • 문자형 벡터 char1과 수치형 벡터 num1을 생성하고 결합하여 test1이라는 데이터 프레임을 만들어 보는 예제
> char1 <- rep(LETTERS[1:3],c(2,2,1)) # 문자형 벡터 char1

> char1
[1] "A" "A" "B" "B" "C"

> num1 <- rep(1:3,c(2,2,1)) # 수치형 벡터 num1

> num1
[1] 1 1 2 2 3

> test1 <- data.frame(char1, num1) # test1 데이터 프레임 생성

> test1
char1 num1
1 A 1
2 A 1
3 B 2
4 B 2
5 C 3

13. 데이터 프레임의 생성 예시 2

  • 문자 a부터 o까지로 이루어진 벡터를 생성하고 이를 5행 3열의 행렬로 변환한 뒤 a1으로 저장하고 데이터 프레임으로 변환
# 문자 벡터 생성
> a1 <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o")

> dim(a1) <- c(5,3) # 5행 3열인 a1 행렬 생성

> a1
[,1] [,2] [,3]
[1,] "a" "f" "k"
[2,] "b" "g" "l"
[3,] "c" "h" "m"
[4,] "d" "i" "n"
[5,] "e" "j" "o"

> test3 <- as.data.frame(a1) # a1을 데이터 프레임으로 변환

> test3
V1 V2 V3
1 a f k
2 b g l
3 c h m
4 d i n
5 e j o

14. 데이터 프레임 결합

  • 서로 다른 데이터 프레임을 생성하였다면, 여러 데이터 프레임을 합하여 하나의 데이터 프레임으로 생성할 수 있으며 이를 위해 아래와 같은 함수가 사용됨
    • ① cbind( ) 함수를 이용하여 옆으로 합치기
    • ② rbind( ) 함수를 이용하여 아래로 합치기
    • ③ merge( ) 함수를 이용하여 병합하기
      • merge( ) 함수를 사용하면 같은 변수에 대해서 한번만 출력

15. 데이터 프레임의 결합 예시 1

  • ① 예제 3-23의 test1과 예제 3-24의 test3라는 데이터 프레임을 cbind() 함수를 이용하여 옆으로 병합
  • ② test4라는 새로운 데이터 프레임을 생성하고 rbind() 함수를 이용하여 test1과 test4를 아래로 병합
> cbind(test1,test3) #test1과 test2를 옆으로 합친 형태
char1 num1 V1 V2 V3 
1 A 1 a f k
2 A 1 b g l
3 B 2 c h m
4 B 2 d i n
5 C 3 e j o

> char1 <- rep(LETTERS[1:3],c(1,2,2))
> char1
[1] "A" "B" "B" "C" "C"

> num1 <- rep(1:3,c(1,1,3))
> num1
[1] 1 2 3 3 3

> test4 <- data.frame(char1, num1)# test4 데이터 프레임 생성
> test4
char1 num1
1 A 1
2 B 2
3 B 3
4 C 3
5 C 3

> rbind(test1, test4)# 아래로 합친 형태
char1 num1 
1 A 1
2 A 1
3 B 2
4 B 2
5 C 3
6 A 1
7 B 2
8 B 3
9 C 3
10 C 3
728x90

'방송대 > R 컴퓨팅' 카테고리의 다른 글

7강. R 프로그래밍의 기초 (2)  (0) 2025.04.11
6강. R 프로그래밍의 기초 (1)  (0) 2025.04.10
4강. 데이터 구조 (1)  (0) 2025.03.15
3강. 데이터 입력과 저장  (0) 2025.03.09
3강. 데이터 요약 2  (0) 2025.03.06
댓글
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
최근에 올라온 글
Total
Today
Yesterday
공지사항