참고도서: 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 ## 1004는 1000보다 크거나 같은가? (T/F)
[1] TRUE
> 1004 == 1000 ## 1004는 1000와 같은가? (T/F)
[1] FALSE
> 1004 != 1000 ## 1004는 1000와 같지 않은가? (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) ## each와 times는 순서가 바뀌어도 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) ## 단, 순서 변경이 가능하므로 each와 times를 빼면 결과값이 달라짐
[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") ## 벡터 room의 5번째 값을 "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 인수에 수준을 1과 2로 지정
> ## 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
'데이터 [Data] > R' 카테고리의 다른 글
R 데이터 가공: 결측값 처리, 그룹별 요약통계량 계산, 변환 (0) | 2021.04.29 |
---|---|
R 데이터 가공: 정렬, 결합 및 분리 (0) | 2021.04.28 |
R 데이터 가공: 행과 열의 선택, 변수 추가 및 삭제 (데이터 프레임) (0) | 2021.04.27 |
R 데이터 구조: 데이터 프레임, 리스트, 데이터 테이블 (0) | 2021.04.24 |
R 데이터 구조: 행렬, 배열 (0) | 2021.04.22 |
댓글