[R데이터분석] 리스트, 데이터프레임
리스트와 데이터 프레임
리스트는 1차원 데이터인 벡터나 서로 다른 구조의 데이터를 그룹으로 묶은 데이터세트, 서로 다른 데이터 유형 저장 가능
데이터프레임은 제일 많이 쓰는 형태, 리스트를 2차원으로 확대한 것
행렬 형태로 되어 있고 비슷하지만 숫자, 문자등 데이터유형을 섞을 수 있다.
list()
list1 <- list(c(1, 2, 3), "Hello") list1
[[1]] [1] 1 2 3
[[2]] [1] "Hello"
str(list1)
List of 2 #두 가지 변수로 구성된 리스트 $ : num [1:3] 1 2 3 $ : chr "Hello"
R에서 대괄호는 인덱스(index)를 의미, 인덱싱
리스트에서는 대괄호를 겹쳐서 데이터의 위치를 표현,
리스트의 첫 번째 변수를 호출하기
list1[[1]]
[1] 1 2 3
#리스트1 생성
list1 <- list(name = 'James Seo', address = 'seoul', tel = '010-8706-4712', pay = 500)
list1
$name <-- Key 부분
[1] "James Seo" <-- Value 부분
$address
[1] "Seoul"
$tel [1] "010-8706-4712"
$pay [1] 500
#list1$name #특정 key 값만 조회하기 :
list1 의 $name 키 조회
list1$name
[1] "James Seo"
#행1부터 2까지 조회
list1[1:2]
$name[1] "James Seo"
$address[1] "seoul"
#List 에 새로운 요소 추가/삭제하기
list1$birth<- '1975-10-23'
<-- 생일을 추가함
list1
$name
[1] "James Seo"
$address [1] "Seoul"
$tel [1] "010-8706-4712"
$pay [1] 500
$birth
[1] "1975-10-23" <-- 추가됨
#하나의 key 에 두개의 value 동시에 넣기
list1$name <- c('Seojinsu', 'James Seo')
list1$name
[1] "Seojinsu" "James Seo"
list1$birth <- NULL
#무시됨: 안나타남
list1
$name
[1] "Seojinsu" "James Seo"
$address
[1] "Seoul"
$tel
[1] "010-8706-4712"
$pay
[1] 500
데이터프레임
데이터 프레임은 실제 업무에서 가장 많이 사용하는 데이터세트로 숫자형 벡터, 문자형 벡터 등 서로 다른 형태의 데이터를 묶을 수 있는 다중형 데이터 세트
행렬과 유사해보이지만 데이터프레임의 각 열에는 변수명이 있어야 함
엑셀의 데이터 구조와 매우 유사
data.frame(변수명1, 변수명2, ...변수명n)
벡터로부터 데이터 프레임 생성하기
no <- c(1,2,3,4)
name <- c('Apple','Peach','Banana','Grape')
price <- c(500,200,100,50)
qty <- c(5,2,4,7)
sales <- data.frame(NO=no,NAME=name,PRICE=price,QTY=qty)
sales
NO NAME PRICE QTY
1 1 Apple 500 5
2 2 Peach 200 2
3 3 Banana 100 4
4 4 Grape 50 7
데이터 프레임 합치기 - rbind( ) , cbind( ) , merge( )사용하기
no <- c(1,2,3)
name <- c('apple','banana','peach')
price <- c(100,200,300)
df1 <- data.frame(NO=no,NAME=name,PRICE=price)
df1
NO NAME PRICE
1 1 apple 100
2 2 banana 200
3 3 peach 300
no <- c(10,20,30)
name <- c('train','car','airplane')
price <- c(1000,2000,3000)
df2 <- data.frame(NO=no,NAME=name,PRICE=price)
df2
NO NAME PRICE
1 10 train 1000
2 20 car 2000
3 30 airplane 3000
합치기
df3 <- cbind(df1,df2)
df3
df4 <- rbind(df1,df2)
df4
NO NAME PRICE
1 1 apple 100
2 2 banana 200
3 3 peach 300
4 10 train 1000
5 20 car 2000
6 30 airplane 3000
NO NAME PRICE NO NAME PRICE
1 1 apple 100 10 train 1000
2 2 banana 200 20 car 2000
3 3 peach 300 30 airplane 3000
df1 <- data.frame(name=c('apple','banana','cherry'), + price=c(300,200,100))
df2 <- data.frame(name=c('apple','cherry','berry'), + qty=c(10,20,30))
df1
name price
1 apple 300
2 banana 200
3 cherry 100
df2
name qty
1 apple 10
2 cherry 20
3 berry 30
#df1 기준으로 df2 와 공통으로 있는 name 컬럼 데이터를 출력함
merge(df1,df2)
name price qty
1 apple 300 10
2 cherry 100 20
#데이터가 없는 것도 모두 나오게 all=T 옵션 지정
merge(df1,df2,all=T)
name price qty
1 apple 300 10
2 banana 200 NA <-- df2 에 banana 가 없어서 NA 로 출력 되었습니다.
3 cherry 100 20
4 berry NA 30 <--df1 에 berry 가 없어서 NA 로 출력 되었습니다
#df1 과 df2 를 합쳐서 하나의 데이터프레임으로 만듦
cbind(df1,df2)
name price name qty
1 apple 300 apple 10
2 banana 200 cherry 20
3 cherry 100 berry 30
cbind(df2,df1)
name qty name price
1 apple 10 apple 300
2 cherry 20 banana 200
3 berry 30 cherry 100
df1
name price
1 apple 300
2 banana 200
3 cherry 100
#추가할 내용을 생성
new <- data.frame(name="mango",price=400)
rbind 로 행을 추가
df1 <- rbind(df1,new)
df1
name price
1 apple 300
2 banana 200
3 cherry 100
4 mango 400
#이렇게도 가능
df1 <- rbind(df1,data.frame(name="berry",price=500))
df1
name price
1 apple 300
2 banana 200
3 cherry 100
4 mango 400
5 berry 500
#열 추가하기
df1 <- cbind(df1,data.frame(qty=c(10,20,30,40,50)))
df1
name price qty
1 apple 300 10
2 banana 200 20
3 cherry 100 30
4 mango 400 40
5 berry 500 50
#데이터 프레임에서 특정 컬럼들만 골라내서 새로운 형태 만들기
no <- c(1,2,3,4,5)
name <- c("서진수","주시현","최경우","이동근","윤정웅")
address <- c("서울","대전","포항","경주","경기")
tel <- c(1111,2222,3333,4444,5555)
hobby <- c("독서","미술","놀고먹기","먹고놀기","노는애감시하기")
member <- data.frame(NO=no,NAME=name, ADDRESS=address,TEL=tel,HOBBY=hobby)
member
NO NAME ADDRESS TEL HOBBY
1 1 서진수 서울 1111 독서
2 2 주시현 대전 2222 미술
3 3 최경우 포항 3333 놀고먹기
4 4 이동근 경주 4444 먹고놀기
5 5 윤정웅 경기 5555 노는애감시하기
#특정컬럼만 지정 subset( , select=c())
member2 <- subset(member,select=c(NO,NAME,TEL))
NO NAME TEL
1 1 서진수 1111
2 2 주시현 2222
3 3 최경우 3333
4 4 이동근 4444
5 5 윤정웅 5555
#특정 컬럼만 제외 subset( , select= - )
member3 <- subset(member,select= -TEL)
NO NAME ADDRESS HOBBY
1 1 서진수 서울 독서
2 2 주시현 대전 미술
3 3 최경우 포항 놀고먹기
4 4 이동근 경주 먹고놀기
5 5 윤정웅 경기 노는애감시하기
#데이터 프레임의 내용 확인 및 출력 순서 지정하기
데이터 프레임 생성하기
ID <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
GENDER <- c("F", "M", "F", "M", "M", "F", "F", "F", "M", "F")
AGE <- c(50, 40, 28, 50, 27, 23, 56, 47, 20, 38)
AREA <- c("서울", "경기", "제주", "서울", "서울", "서울", "경기", "서울", "인천", "경기")
dataframe_ex <- data.frame(ID, GENDER, AGE, AREA) dataframe_ex
ID GENDER AGE AREA
1 1 F 50 서울
2 2 M 40 경기
3 3 F 28 제주
4 4 M 50 서울
5 5 M 27 서울
6 6 F 23 서울
7 7 F 56 경기
8 8 F 47 서울
9 9 M 20 인천
10 10 F 38 경기
변수 속성 확인
str(dataframe_ex)
'data.frame': 10 obs. of 4 variables:
$ ID : num 1 2 3 4 5 6 7 8 9 10
$ GENDER : chr "F" "M" "F" "M" ...
$ AGE : num 50 40 28 50 27 23 56 47 20 38
$ AREA: chr "서울" "경기" "제주" "서울" ...
#관측치가 10개이고 변수가 4개인 데이터프레임 생성됨
#obs: 관측치 observation 각 변수에 들어있는 관측치의 갯수는 같아야 한다.