R복습_데이터구조 리스트(생성, 인덱스, 슬라이싱, 함수, 결합)

2024. 9. 27. 11:07R분석

리스트

리스트는 r의 데이터 구조중에 서로다른 사료형의 값들을 저장하고 다룰 수 있는 데이터 구조이다. 리스트는 속성명과 속성값으로 이루어져있으며 이는 파이썬의 딕셔너리구조와 비슷한 구조를띄고있다.

 

 

리스트 생성

#리스트


#리스트의 생성
#list(속성명1=속성값1, 속성명2= 속성값2,...)함수사용

score=c(60,70,80)
names(score) <- c("R","python","sql")

my.info <- list(name='짱구', age=5, gender='Male',score=score)
#미리 벡터로 score를 만들어놓고 리스트에서 다시 score라는 속성명에 할당한것
print(my.info)

리스트는 리스트명 <-list(속셩명=속성값,...)의 형태로 만들며, 리스트안에는 서로 다른 데이터구조를 저장할 수 있기때문에 위의 쿼리에서 score는 벡터로만들어 리스트의 속성값에 저장한 형태인것이다.

 

 

리스트 요소접근

#리스트 요소 접근
print(my.info[1]) #첫번째의 속성명, 속성값이 둘다 출력
print(my.info[1:3]) #슬라이싱 가능
print(my.info[[1]]) #[[]]이중괄호 사용하면 속성값만 출력가능
print(my.info[[1:3]]) #[[]]이중괄호 슬라이싱 불가

#리스트 요소중 벡터접근
print(my.info[[4]][1]) #4번째 요소중 1번째의 값
print(score[1]) #위와 동일한 값

#리스트 속성명으로 접근하기
print(my.info$name)
print(my.info$score)
print(my.info$age)
print(my.info$score["R"]) #속성명안에서 다시 이름으로 접근
print(my.info$score["python"])
print(score['python']) #바로 속성명으로 접근해도 됨

리스트의 요소에 개별값으로 접근할때 인덱스번호를 사용하면 속성명과 속성값이 함께 출력되고 [[]]이중괄호를 사용하게 되면 속성값만 출력할 수 있다. 리트스역시 슬라이싱이 가능한데, 속성값만 출력한다고 [[]]이중괄호안에 슬라이싱을 하게되면 에러가 발생하며 출력되지 않는다.

 

리스트요소중에 벡터로 저장된 값이 있다면 그 벡터에만 따로 접근하는것도 가능하다. [[]]이중괄호 안에 속성명의 순서를 적은 후에 뒤에 []일반 대괄호를 사용하여 벡터중 출력하고싶은 요소의 인덱스번호를 적어 출력할 수 있다. 이 경우 속성명[인덱스번호]를 적어도 같은 결과를 반환한다.

리스트에 속성명으로 접근할때는 리스트명$속성명을 사용하여 접근하고, 속성값중에서도 이름이 있는 벡터값이라면 []괄호안에 이름으로도 접근이 가능하다.

 

 

리스트의 요소 값 수정

#리스트의 요소 값 수정
#1)리스트의 속성명 사용
my.info$name <- '맹구'
print(my.info) #기존의 짱구 -> 맹구 수정

my.info$name <- '유리'
print(my.info$name)

#2)인덱스 번호 사용
my.info[2] <- 7
print(my.info)

my.info[2] <- 6
print(my.info)

요소를 수정할때는 먼저 수정하고자하는 요소값에 접근한후 <-대입연산자를 사용하여 수정할 값을 적는 방식으로 리스트의 요소를 수정한다.

 

 

리스트 요소 추가

#리스트 요소 추가
#리스트명$추가할 속성명 <- 속성값
my.info$class <- '해바라기반'
print(my.info)

리스트에 새로운 속성을 추가하고싶을때는 리스트명$새로운 속성명 <- 속성값을적어 새로운 값을 추가시킨다.

 

 

리스트의 속성함수

#리스트의 속성함수
#length() : 리스트의 길이
print(length(my.info)) #속성값과 속성명은 한쌍이여서 1개로취급

#names() : 리스트의 속성명 확인
print(names(my.info))

리스트도 다른 데이터 구조와 마찬가지로 요소의 개수를 확인할 수 있는 length함수를 사용할 수 있는데 리스트의 경우에는 속성갑소가 속성을 한쌍으로 취급하여 하나의속성에 속성값이 100개가 있어도 1개로 카운트되어 출력된다.

names은 리스트의 속성명만 따로 출력할 수 있는 속성함수 이다.

 

 

리스트의 결합

#리스트의 결합
list_a <- list(a=1, b=2)
list_b <- list(c=3, d=4)
print(list_a)
print(list_b)

merge_list <- c(list_a,list_b)
print(merge_list)

#리스트는 연산이 불가능함.
print(list_a+10)
print(list_a+list_b)
#결합만 가능

리스트는 다른 데이터 구조들과는 다르게 서로다른 데이터의구조가 들어가 있기때문에 연산이 불가능하다. 이때 두 리스트를 합쳐서 하나의리스트로 만들고싶다면 리스트를 결합시켜주어야한다. 리스트의결합은 새로운 변수에 합치고싶은 리스트를 c()함수로 묶어 전달해야한다.

 

 

리스트의 활용 : 행렬과 배열의 이름

#리스트의 활용 : 행렬과 배열의 이름
ma1=matrix(1:6,nrow=2,ncol=3)
print(ma1) #2행 3열의 행렬

#dimnames(행열 or 배열)
#리스트를 이용하여 행열과 배열에 행이름, 열이름을 지정할 수 있다
dimnames(ma1) <- list(c('row1','row2'),c('col1','col2','col3'))
print(ma1)

ar1 <- array(1:12,dim=c(2,3,2))
print(ar1)
#배열은 차원이름까지 지정할 수 있음
dimnames(ar1) <- list(c('row1','row2'),c('col1','col2','col3'),c('slide1','slide2'))
print(ar1)

리스트를 활용하면 배열과 행렬의 행과 열에 이름을 부여할 수 있다. 이때 사용하는 함수는 dimnames라는 함수이며

dimnames(행렬 or 배열) <- list(c(행이름1, 행이름2,..),c(열이름1, 열이름2...),행렬일경우c(차원명1, 차원명2,..))의형태로 적어 전달한다.

 

리스트 활용 실습코드

#<실습>
#1)아래의 정보가 들어간 리스트 생성
#학생이름(name) : "둘리"
#학생나이(age) : "10"
#학생 점수(scores): 
#           국어: 80 수학: 90 영어:75


scores <- c(80,90,75)
names(scores) <- c('국어','수학','영어')

stu_info <- list(name='둘리', age=10, scores=scores )
print(stu_info)



#2) 위의 리스트에서 학생의 수학점수를 85점으로 수정
stu_info[[3]][2]
stu_info[[3]][2] <- 85
print(stu_info$score)

#3)학생의 평균점수, 총합점수를 출력
cat('학생의 평균점수 : ', mean(stu_info$scores),'점')
cat('학생의 총합점수 : ', sum(stu_info$scores),'점')

#4) 학생 리스트에서 주소(address)="서울"요소 추가
stu_info$address <- '서울'
print(stu_info)

 

 

 


 

학습일기

R을 공부하기전 파이썬을 먼저 공부를 했었어서 그런가 파이썬에도 리스트와 딕셔너리라는 자료구조가 있는데 R에서의 리스트는 파이썬의 리스트와 이름이 동일한데 구조는 딕셔너리와 비슷해서 신기하고 재밌었고 리스트의 경우에는 다른 데이터구조와 달리 서로다른 구조의 데이터가 요소로 들어갈 수 있다는점, 그리고 이때문에 당연히 연산이 불가능하다는점이 기억에 남았다. 리스트는 말그대로 카테고리처럼 데이터에 이름을 부여하여 관리할 수 있다는점에서 실제 실무에서 많이 사용될것같다고 생각했다.