본문 바로가기
데이터 [Data]/R

R 데이터 구조: 벡터, 팩터

by 냉철하마 2021. 4. 20.

참고도서: R 통계 프로그래밍의 이해 - 차영준, 박진표 (자유아카데미) 2장

www.yes24.com/Product/Goods/68712840

 

R 통계 프로그래밍의 이해

'최근에 빅데이터와 관련된 용어들이 많이 사용되고 있다. 인공지능, 머신러닝, 데이터 과학, 데이터 과학자, 4차 산업혁명 등과 같은 단어들을 많이 접하게 된다. 이처럼 많은 사람들이 빅데이

www.yes24.com

 

> #### 2.1 R 데이터 구조 ####

> # 2.1.1 R의 계산기 기능과 변수 #

>

> #R의 계산기 기능

> 10+10

[1] 20

> 25-11

[1] 14

> 2*5000

[1] 10000

> 15000/75

[1] 200

> 10+2 ; 10-2 ## 2개 이상의 명령어를 한 행에 표시

[1] 12

[1] 8

> 1004%%2 ## %%: 나눗셈의 나머지 계산

[1] 0

> 1004%/%5 ## %/%: 나눗셈의 몫 계산

[1] 200

>

> #R의 비교연산자

> 1004 >= 1000 ## 10041000보다 크거나 같은가? (T/F)

[1] TRUE

> 1004 == 1000 ## 10041000와 같은가? (T/F)

[1] FALSE

> 1004 != 1000 ## 10041000와 같지 않은가? (T/F)

[1] TRUE

>

> #R의 변수와 유형

> a <- 1004 ## 변수에 데이터 담기

> a

[1] 1004

> a = 1001 ## 변수에 데이터 담기(2)

> a

[1] 1001

> mode(a) ## 객체의 유형 판단

[1] "numeric"

>

> b <- "Welcome to R world"

> b

[1] "Welcome to R world"

> mode(b)

[1] "character"

>

> c <- (1004>1003)

> c

[1] TRUE

> mode(c)

[1] "logical"

>

> #### 2.2 벡터 ####

>

> # 2.2.1 c() 함수에 의한 벡터의 생성 #

> xVec <- c(11,22,33,44,55,66,77) ## C() 함수로 묶어 수치형 데이터를 넣은 벡터 생성

> xVec

[1] 11 22 33 44 55 66 77

> mode(xVec)

[1] "numeric"

>

> yVec <- c("R", "Python", "Java", "C", "html") ## C() 함수로 묶어 문자형 데이터를 넣은 벡터 생성

> yVec

[1] "R" "Python" "Java" "C" "html"

> mode(yVec)

[1] "character"

>

> zVec <- c(T, T, F, F, T) ## C() 함수로 묶어 논리형 데이터를 넣은 벡터 생성

> zVec

[1] TRUE TRUE FALSE FALSE TRUE

> mode(zVec)

[1] "logical"

>

> # 2.2.2 수열 연산자(:)에 의한 벡터의 생성 #

> 1004:1020

[1] 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020

> 1020:1004

[1] 1020 1019 1018 1017 1016 1015 1014 1013 1012 1011 1010 1009 1008 1007 1006 1005 1004

> -10:10

[1] -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10

>

> # 2.2.3 seq() 함수에 의한 벡터의 생성 #

> seq(from=1, to=20) ## 1부터 20까지 1씩 증가하는 등차수열

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

> seq(1,20)

[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

> seq(1,20, by=2) ## 1부터 20까지 2씩 증가하는 등차수열

[1] 1 3 5 7 9 11 13 15 17 19

> seq(1,20,2)

[1] 1 3 5 7 9 11 13 15 17 19

> seq(20,1,-3) ## 20부터 1까지 -3씩 증가(=3씩 감소)하는 등차수열

[1] 20 17 14 11 8 5 2

> seq(1,30,6)

[1] 1 7 13 19 25

>

> # 2.2.4 rep() 함수에 의한 벡터의 생성 #

> rep(1004, times=5) ## 숫자 1004를 다섯 번 반복

[1] 1004 1004 1004 1004 1004

> rep(1004,5)

[1] 1004 1004 1004 1004 1004

> rep(1:3, times=2) ## 1부터 3까지의 수열을 두 번 반복

[1] 1 2 3 1 2 3

> rep(1:3, 2)

[1] 1 2 3 1 2 3

> rep(c(1,2,3),2) ## c() 함수로 묶인 1,2,3을 두 번 반복

[1] 1 2 3 1 2 3

> rep(1:3, each=2) ## 1:3의 개별 값을 두 번씩 반복

[1] 1 1 2 2 3 3

> rep(1:3, each=3, times=2) ## 1:3의 개별값 3번 반복한 후 전체 데이터를 두 번 반복

[1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3

> rep(1:3, times=2, each=3) ## eachtimes는 순서가 바뀌어도 each 먼저 적용

[1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3

> rep(1:3, 3, 2) ## , 순서 변경이 가능하므로 eachtimes를 빼면 결과값이 달라짐

[1] 1 2

> rep(1:3, 3)

[1] 1 2 3 1 2 3 1 2 3

> rep(c("Y","N"), c(10,5)) ## "Y"10, "N"5번 반복

[1] "Y" "Y" "Y" "Y" "Y" "Y" "Y" "Y" "Y" "Y" "N" "N" "N" "N" "N"

>

>

> # Special. rep_len() 함수: "repeat_length", 벡터를 입력한 길이까지 반복

> ??rep_len()

> rep(1:4,2) ## 1부터 4까지 두 번 반복

[1] 1 2 3 4 1 2 3 4

> x <- factor(LETTERS[1:4]) ## LETTERS: 알파벳 대문자

> x

[1] A B C D

Levels: A B C D

> y <- factor(letters[1:7]) ## letters: 알파벳 소문자

> y

[1] a b c d e f g

Levels: a b c d e f g

> rep(x, 2) ## "A B C D"x 벡터를 두 번 반복

[1] A B C D A B C D

Levels: A B C D

> rep_len(x, 10) ## x 벡터를 10개까지 반복 => "A B C D A B C D A B"

[1] A B C D A B C D A B

Levels: A B C D

> rep_len(y,25)

[1] a b c d e f g a b c d e f g a b c d e f g a b c d

Levels: a b c d e f g

>

> rep_len(15:45,130) ## 수치형(numeric) 데이터에 적용

[1] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

[32] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

[63] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

[94] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

[125] 15 16 17 18 19 20

> rep(TRUE:FALSE, 4) ## 논리형(logical) 데이터에 적용

[1] 1 0 1 0 1 0 1 0

> rep_len(T:F,20)

[1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

> rep_len("LOONA Butterfly",12) ## 문자형(character) 데이터에 적용

[1] "LOONA Butterfly" "LOONA Butterfly" "LOONA Butterfly" "LOONA Butterfly" "LOONA Butterfly"

[6] "LOONA Butterfly" "LOONA Butterfly" "LOONA Butterfly" "LOONA Butterfly" "LOONA Butterfly"

[11] "LOONA Butterfly" "LOONA Butterfly"

>

> # 2.2.5 scan() 함수에 의한 벡터의 생성 #

> x <- scan() ## 콘솔(Console)에서 수치형 데이터 입력, 종료하려면 콘솔에서 엔터키

1: x ## 출력

Error in scan() : scan()'a real'를 입력받아야 하는데, 'x'를 받았습니다

> y <- scan(what="character") ## 콘솔에서 문자형 데이터 입력

1: y

2: z <- scan(file="R2.txt") ## 외부 텍스트 파일 불러오기

10: z

11:

Read 10 items

> # 2.2.6 paste()paste0() 함수에 의한 반복되는 문자열 생성 #

> paste("room", 101:107) ## "room"101:107 사이에 공백을 두고 반복되는 문자열 생성

[1] "room 101" "room 102" "room 103" "room 104" "room 105" "room 106" "room 107"

> paste("room", 101:107, sep="") ## "room"101:107 사이에 공백 없이 반복되는 문자열 생성

[1] "room101" "room102" "room103" "room104" "room105" "room106" "room107"

> paste0("room", 101:107)

[1] "room101" "room102" "room103" "room104" "room105" "room106" "room107"

>

> # 2.2.7 replace() 함수에 의한 일부 데이터의 변경 #

> room <- paste("room", 101:107)

> room

[1] "room 101" "room 102" "room 103" "room 104" "room 105" "room 106" "room 107"

> replace(room, 5, "suiteRoom") ## 벡터 room5번째 값을 "suiteRoom"으로 변경

[1] "room 101" "room 102" "room 103" "room 104" "suiteRoom" "room 106" "room 107"

>

> # 2.2.8 append() 함수에 의한 특정 위치에 데이터를 추가 #

> room <- paste("room", 101:107, sep="")

> room

[1] "room101" "room102" "room103" "room104" "room105" "room106" "room107"

> append(room, "suiteRoom", after=1) ## 벡터 room의 첫번째 값 다음에 "suiteRoom" 추가

[1] "room101" "suiteRoom" "room102" "room103" "room104" "room105" "room106" "room107"

> append(room, "suiteRoom") ## 벡터 room의 마지막 값으로 "suiteRoom" 추가

[1] "room101" "room102" "room103" "room104" "room105" "room106" "room107" "suiteRoom"

>

> # 2.2.9 첨자 []에 의한 벡터의 원소 추출 #

> vec <- 1185:1214 ## 벡터 생성

> vec

[1] 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203

[20] 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214

> vec[20] ## 20번째 원소 추출

[1] 1204

> vec[1:10] ## 1~10번째 원소 추출

[1] 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194

> vec[-1] ## 1번째 원소 제외한 벡터 생성

[1] 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204

[20] 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214

> vec[-11:-20] ## 11~20번째 원소 제외한 벡터 생성

[1] 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1205 1206 1207 1208 1209 1210 1211 1212 1213

[20] 1214

>

> yVec <- c("R", "Python", "Java", "C", "html")

> yVec

[1] "R" "Python" "Java" "C" "html"

> yVec[2]

[1] "Python"

> yVec[1:2]

[1] "R" "Python"

> yVec[-5]

[1] "R" "Python" "Java" "C"

> yVec[-1:-2]

[1] "Java" "C" "html"

>

> # 2.2.10 names() 함수에 의한 벡터의 접근 #

> score <- c(95, 90, 88, 86, 99, 100, 93)

> names(score) <- c("RED","ORANGE","YELLOW","GREEN","BLUE","DARKBLUE","PURPLE")

> score ## 부여된 이름 확인

RED ORANGE YELLOW GREEN BLUE DARKBLUE PURPLE

95 90 88 86 99 100 93

> score[3] ## 3번째 원소 확인 -> , 이름 동시 출력

YELLOW

88

> score["PURPLE"] ## "PURPLE" 이름을 가진 값 출력

PURPLE

93

> score[2:4] ## 2~4번째 원소 확인

ORANGE YELLOW GREEN

90 88 86

> score[c("RED","BLUE")] ## "RED", "BLUE" 이름을 가진 값 출력

RED BLUE

95 99

> names(score)[6] ## score 벡터의 6번째 이름값 출력

[1] "DARKBLUE"

>

> # 2.2.11 R에서 결측값은 NA로 표현 #

> xVec <- c(11,22,33,44,55,66,NA) ## 결측값 있는 벡터 생성

> xVec

[1] 11 22 33 44 55 66 NA

> is.na(xVec) ## 결측값이 있는가? (T/F)

[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE

> mean(xVec) ## 평균값

[1] NA

> mean(xVec, na.rm=TRUE) ## 결측값을 제외한 평균값

[1] 38.5

>

>

>

> #### 2.3 팩터 ####

>

> # 2.3.1 factor() 함수: 명목형 데이터 생성 #

> gender <- c("M","M","F","F","M","M","M","M","M","F")

> gender

[1] "M" "M" "F" "F" "M" "M" "M" "M" "M" "F"

> mode(gender)

[1] "character"

>

> genderF <- factor(gender) ## 범주형 데이터로 변환

> genderF

[1] M M F F M M M M M F

Levels: F M

> is.factor(genderF) ## 팩터로 변경되었는지 확인 (T/F)

[1] TRUE

> mode(genderF)

[1] "numeric"

>

> gender <- c(1,1,2,2,1,1,1,1,1,2)

> factor(gender)

[1] 1 1 2 2 1 1 1 1 1 2

Levels: 1 2

> genderfactor <- factor(gender, levels=c(1,2), labels=c("M","F"))

> ## gender 벡터를 팩터로 변경, levels 인수에 수준을 12로 지정

> ## labels 인수로 이름을 "M""F"로 지정

> genderfactor

[1] M M F F M M M M M F

Levels: M F

>

> factor(gender, levels=c(1,2), labels=c("M","F"))

[1] M M F F M M M M M F

Levels: M F

>

> # 2.3.2 factor() 함수: 순서형 데이터 생성 #

> size <- c("S","M","L","M","M","XL","S","XS","M","L","L")

> factor(size)

[1] S M L M M XL S XS M L L

Levels: L M S XL XS

> as.numeric(factor(size)) ## 수치형 데이터로 표시

[1] 3 2 1 2 2 4 3 5 2 1 1

> factor(size, levels=c("XS","S","M","L","XL"))

[1] S M L M M XL S XS M L L

Levels: XS S M L XL

>

> #factor() 함수에서 인수 labels

> size <- c("S","M","S","L","XL","XS","S","L","L","M") ## size 벡터 생성

> factor(size, levels=c("XS","S","M","L","XL"), ## "XS~XL"까지 레벨 부여

+ labels=c("X-Small","Small","Medium","Large","X-Large")) ## X-Small부터 X-Large까지 이름 부여

[1] Small Medium Small Large X-Large X-Small Small Large Large Medium

Levels: X-Small Small Medium Large X-Large

>

> #factor(x)의 벡터 x가 수치형일 때 순서형 팩터 생성

> size <- c(1,2,3,1,2,1,1,2,1,3)

> size <- factor(size, labels=c("Small","Medium","Large"),ordered=TRUE)

> ## 'ordered = TRUE' 지정하여 "Levels: Small < Medium < Large" 설정

> size

[1] Small Medium Large Small Medium Small Small Medium Small Large

Levels: Small < Medium < Large

>

>

> # 2.3.3 cut() 함수를 이용한 팩터 생성

> x <- c(1,2,3,4,5)

> cut(x, breaks=3) ## x의 수(1~5)를 임의로 3개의 구간으로 나누는 코드

[1] (0.996,2.33] (0.996,2.33] (2.33,3.67] (3.67,5] (3.67,5]

Levels: (0.996,2.33] (2.33,3.67] (3.67,5]

> cut(x, breaks=3, labels = FALSE) ## 기본값은 (a,b] 형식, labels=FALSE인 경우 정수로 구간 지정

[1] 1 1 2 3 3

> cut(x, breaks=3, right = FALSE) ## 닫힌 구간을 오른쪽이 아닌 왼쪽으로 변경, 이 때 오른쪽은 열린 구간으로 변경 = [a,b)

[1] [0.996,2.33) [0.996,2.33) [2.33,3.67) [3.67,5) [3.67,5)

Levels: [0.996,2.33) [2.33,3.67) [3.67,5)

>

> y <- c(0,87,76,55,64,97,100)

> cut(y, breaks = c(0,60,70,80,90,100), right=FALSE,

+ labels = c("F","D","C","B","A")) ## 닫힌 구간을 왼쪽으로, F에서 D~A까지 labels로 이름 부여

[1] F B C F D A <NA>

Levels: F D C B A

> cut(y, breaks = c(0,60,70,80,90,100), right=FALSE, include.lowest = TRUE,

+ labels = c("F","D","C","B","A")) ## right=FALSE인 경우 include.lowest로 최댓값 포함여부 지정

[1] F B C F D A A

Levels: F D C B A

> cut(y, breaks = c(0,60,70,80,90,100), labels = c("F","D","C","B","A"))

[1] <NA> B C F D A A

Levels: F D C B A

> cut(y, breaks = c(0,60,70,80,90,100), include.lowest = TRUE,

+ labels = c("F","D","C","B","A")) ## (right=TRUE -> 최솟값 포함여부 지정)

[1] F B C F D A A

Levels: F D C B A

>

> z <- c(64, 77, 71, 68, 89, 91, 100, 96, 58, 84)

> cut(z, breaks = c(0,60,65,70,75,80,85,90,95,100), right = FALSE, include.lowest = TRUE,

+ labels=c("F","D0","D+","C0","C+","B0","B+","A0","A+")) ## A+, A0 등의 학점으로 적용

[1] D0 C+ C0 D+ B+ A0 A+ A+ F B0

Levels: F D0 D+ C0 C+ B0 B+ A0 A+

>

> OW <- c(1000, 1537, 2503, 2430, 1924, 3300, 2980, 4278, 3988, 4799, 2168, 5000)

> cut(OW, breaks = c(0,1500,2000,2500,3000,3500,4000,5000), right = FALSE, include.lowest = TRUE,

+ labels = c("Bronze", "Sliver", "Gold", "Platinum", "Diamond", "Master", "G.Master")) ## 응용: 오버워치 랭크 등급

[1] Bronze Sliver Platinum Gold Sliver Diamond Platinum G.Master Master G.Master

[11] Gold G.Master

Levels: Bronze Sliver Gold Platinum Diamond Master G.Master

 

댓글