R복습_데이터구조 배열(생성, 인덱스, 슬라이싱, 함수, 연산)

2024. 9. 27. 01:03R분석

배열

배열은 동일한 유형의 데이터를 다차원 구조로 저장하는 데이터 구조이다. 배열은 행렬과 비슷하지만 2차원 이상의 구조를 가질 수 있으며 주로 다차원 데이터를 저장하고 조작할때 사용된다.

 

 

배열 생성

#배열

#배열 생성하기
#array(데이터, dim=c(행, 열, 차원))

ar1 <- array(1:24, dim=c(3,4,2))#3행 4열의 2차원
#3행 4열로된 배열을 2차원에 걸쳐 만들어달라는 명령어
print(ar1)# 2차원 배열
print(dim(ar1)) #dim을 array에 사용할 경우 차원까지 함께 출력됨
print(length(ar1)) #배열의 요소개수는 차원전부 합쳐서 출력

배열을 생성할때는 배열명 <- array(데이터, dim=c(행, 열, 차원))의 형태로 만든다. 행렬에서 행과 열의 개수를 반환했던 dim을 배열에 사용하면, 행개수, 열개수, 차원개수까지 함께 반환하며, length를 사용하면 배열이 가진 모든 요소의 개수를 반환한다.

 

 

배열 요소접근(인덱싱, 슬라이싱)

#배열의 요소 접근
#배열명[행번호, 열번호, 차원]
print(ar1[3,2,2]) #3행 2열 2차원의 값= 18
print(ar1[1,2,1]) #1행 2열의 1차원의 값 =4
print(ar1[,2,1])


#슬라이싱
print(ar1[2:3,1:2,1]) #2~3행에서 1~2열의 1차원값
print(ar1[1:2,3:4,2])

배열의 요소에 접근하기 위해서는 배열명[행번호,열번호,차원수]를 적어 접근해야하며 행렬의 인덱싱과 마찬가지로 열만가지고오거나 행만 가지고 오고싶다면 해당값을 생략한 후적는다. 배열의 슬라이싱도 행렬의 슬라이싱과 마찬가지로 [1:2,3:4,2]의 형태로 적으며, 차원을 가지고있는 데이터 구조인 만큼, 슬라이싱이든 인덱싱이든 항상 차원의 수를 적어야한다.

 

 

배열의 차원에 함수적용하기

#배열의 특정 차원에 함수 적용
#apply(배열명, 1or 2함수)
row_sums <- apply(ar1,1,sum)
print(row_sums)
#차원의 행끼리 또 합쳐져서 최종결과 반환

row_max <- apply(ar1,1,max)
print(row_max)

print(apply(ar1,2,min)) #열중의 최소값
print(apply(ar1,2,sum)) #열별 합계


#1차원의 배열(행렬)만 따로 추출해 계산하기
ma1 <- ar1[,,1]
print(ma1)
print(rowSums(ma1))
#차원별로 값을 따로 계산하고싶다면 차원을 다른 변수에 할당하여 계산해야함
#차원을 따로 빼면 행렬이 되기때문에 행렬의 특수함수 사용가능

행렬과 마찬가지로 배열에서도 apply함수적용이 가능한데, 사용방법은 동일하게 apply(배열명, 1or2,함수)로적어준다. 배열의 경우 모든 차원의 모든 행,열끼리의 값을 반환한다. 만약 apply(배열명,1,sum)이라고 함수를 적용한경우 차원끼리의 행의 합산결과를 가지고 모든 차원의 행끼리 다시 합산을 계산하여 결과값을 반환한다.

 

 

배열의 연산

#배열의 연산
#배열간의 연산은 요소별로 실행된다.
ar_a <- array(1:8,dim=c(2,2,2))
print(ar_a)
ar_b <- array(9:16,dim=c(2,2,2))
print(ar_b)

#배열 개별연산
print(ar_a+10)

#배열끼리의 연산
print(ar_a+ar_b)

베열역시 다른 데이터구조와 마찬가지로 배열명+10으로 계산할 경우 배열이 가진 모든 요소값마다 개별로 +10이 되는 개별 연산이 가능하며, 배열끼리 계산할경우 같은 위치에 있는 요소끼리 연산된다.

 

 

배열 확인 함수

#배열 확인 함수
#is.array(객체명)
print(is.array(ar_a)) #array배열이 맞냐고 물어보는것
#ar_a는 array배열이 맞기때문에 TRUE반환

vec <- seq(10,30,10)
print(is.array(vec))
#vec는 벡터이기때문에 FALSE출력됨

배열의 확인 함수인 is.array는 함수에 주어지는 객체가 배열이 맞는지 아닌지 물어보는 함수이다. 배열이 맞다면 TRUE를 반환하며 배열이 아닌경우에는 FALSE를 반환한다.

 

 

 


학습일기

배열은 정말 행렬과 거의 다른점이 없어서 배열이 차원을 가진 구조라는것만 기억하면 될것같다. 그리고 배열을 생성할때 차원까지 적어주어야하며, 행의 개수와 열의개수, 그리고 차원까지 고려해서 데이터를 구성하는 요소의 개수가 맞는지 확인하는것도 잊지 말아야겠다..! 배열부분에서 딱히 어려운점은 없었지만 배열에서 행렬의 집합이고 행렬은또 벡터의 집합구조인것처럼 데이터구조가 종류에 따라 나뉘어져있긴하지만 전부다 유기적으로 연결되어있다는점에서 데이터 구조를 잘 활용할 줄 아는 사람이 되어야겠다고 느꼈다.