Programming Language/etc

[R.입문] R 자료구조 - 리스트와 데이터프레임

김크리 2021. 10. 6. 21:11

목차

리스트

리스트는 R에서 다양한 객체를 원소로 가질 수 있는 자료구조이다. 데이터프레임, 리스트 및 함수도 원소로 가질 수 있다.

  • 광범위하게 사용 되는 자료구조
  • 인덱싱 시 대괄호 두개 = [[]]를 사용한다.
  • 리스트 원소엥 이름이 있으면 $ 기호를 사용하여 해당 원소를 선택할 수 있다.

리스트 생성

list() 함수를 사용하여 원소를 나열하여 리스트를 생성할 수 있다.

list(원소명 = 원소1, 원소명2 = 원소2,...)
# 리스트 생성
num <- seq(from=1, to =10, by=2)
cha <- rep(x=c('a','b'),each=3)

lst1<-list(num, cha)
print(x=lst1)

class(x=lst1)

# list 의 구조 확인
str(object=lst1)

#원소명이 붙은 리스트 생성
lst2 <- list(a=num, b=cha, c=lst1)
print(x=lst2)
class(x=lst2)
str(object=lst2)

리스트 원소 선택

리스트의 원소를 선택할 때 겹대괄호([[]])와 $를 사용할 수 있다.

특정 리스트의 이름 뒤에 $ 기호를 붙이는 순간 해당 리스트에 대한 원소를 선택할 수 있다.

#리스트 원소 선택
lst1$a
lst2$b

lst1[[1]]
# 2개 이상을 동시에 선택할 수 없다.
lst2[[1,3]]

lst2[1]
# 해당 위치의 원소를 리스트로 반환한다.
lst2[c(1,3)]

리스트 원소 추가 및 삭제

인덱시을 이용하여 새로운 원소를 추가/삭체할 수 있다. $ 기호 뒤에 새로운 원소명을 지정하여 원소로 추가할 객체를 할당한다.

#리스트 원소 추가
lst2$d <- 1:5
str(object=lst2)

#리스트 원소 삭제
lst2&a <- NULL
str(object = lst2)

리스트 원소 변경

리스트의 원소를 변경할 때 $를 이용하여 리스트 인덱싱을 이용한다.

#리스트 원소 변경
#통째로 변경가능능
lst2$b <- letters[1:5]
print(x=lst2$b)

#원소만 변경 가능
lst2$b[1] <- 'A'
print(x=lst2$b)

데이터프레임

R은 엑셀 문서인 xls, xlsx 파일이나 텍스트 문서인 csv 파일을 데이터 프레임으로 생성한다. 이는 가장 R에서 많이 사용하게 되는 자료구조라고 할 수 있다.

 

데이터프레임 생성

data.frame() 함수를 사용하여 데이터프레임을 생성한다. data.frame() 함수 안에 열벡터를 콤마(,)로 나열한다. 열 벡터마다 열이름을 붙일 수 있으며, 열 이름과 열 벡터를 등호(=)로 연결한다.

data.frame(열이름1=열벡터1, 열이름2 = 열벡터2,...)
#데이터 프레임 생성
num <- seq(from=1, to=10, by=2)
chr <- rep(x=c('a','b'),each=3)

# 길이가 다른 값으로 데이터프레임 생성 불가능
df2 <- data.frame(num,chr)

cha <- letters[1:5]
df1 <- data.frame(num, cha)
print(x=df1)

# 데이터프레임 구조와 값 확인
str(object = df1)

# R언어가 가지고 있는 다양한 옵션 사용가능
#max.print는 기본값이 1000이다. 출력할 수 있는 최대 벡터원소이다.
options('max.print')

# 데이터프레임을 시각화한다.
View(x=df1)

데이터프레임 원소 선택

특정 위치에 저장된 원소를 선택하는데 대괄호를 사용하고 , 대괄호 안에 콤마를 추가한다.

#인덱싱으로 선택하기
df1[1,1]

df1[1:2, 1:2]

df1[1,]
df1[1:2,]

#문자형 벡터로 열 선택하기
df1[,'num']
df1[,c('num','cha')]

#열 이름으로 열 선택하기
df1$num
df1$cha

#true/false 로 반환하기
df1$num >= 5

df1[df1$num >= 5,]

df1[df1$num >= 5, 'cha']
df1$cha[df1$num >= 5]

데이터프레임 원소 추가

새로 벡터를 추가할때 리스트와 같이 $ 기호로 추가할 열이름을 지정하고 원하는 벡터를 할당하는 방식을 사용한다.

#원소 추가하기
df1$int <- 11:15
str(object = df1)

#열 추가하기
cbind(df1, rep(x=TRUE, times=5))
cbind(df1, log= rep(x=TRUE, times=5))

df1<-cbind(df1, log=rep(x=TRUE, times=5))
str(object = df1)

# 행 추가하기
df3 <- data.frame(num=6, cha='f',int=16, log=TRUE)
print(df3)
rbind(df1, df3)
str(object = df1)

데이터프레임 원소 삭제

#열 벡터 삭제
df1$num <-NULL
str(object = df1)

#인덱싱 삭제
df1[-1,-1]
df1[-1,]
df1[,-1]

데이터프레임 원소 변경

#데이터프레임 원소 변경
#LETTERS 는 대문자
df1$cha <- LETTERS[1:5]
print(x=df1)

df1$int[1] <- '11'
str(object = df1)

참고

나성호의 R 데이터 분석 입문 도서
https://github.com/HelloDataScience/DAwR