참고도서: R 통계 프로그래밍의 이해 - 차영준, 박진표 (자유아카데미) 3장
www.yes24.com/Product/Goods/68712840
R 통계 프로그래밍의 이해
'최근에 빅데이터와 관련된 용어들이 많이 사용되고 있다. 인공지능, 머신러닝, 데이터 과학, 데이터 과학자, 4차 산업혁명 등과 같은 단어들을 많이 접하게 된다. 이처럼 많은 사람들이 빅데이
www.yes24.com
> #### 3.1 데이터 프레임에서 행과 열의 선택 ####
>
> # 3.1.1 첨자 []를 이용한 행과 열의 선택 #
>
> #첨자 []를 이용한 데이터 프레임의 행 선택
> name <- c("Cha","Park","Jung","Kim","Lee")
> toeic <- c(900, 850, 990, 690, 730)
> gpa <- c(4.5, 3.8, 4.5, 3.2, 3.1)
> student <- data.frame(name, toeic, gpa, stringsAsFactors = FALSE)
> student
name toeic gpa
1 Cha 900 4.5
2 Park 850 3.8
3 Jung 990 4.5
4 Kim 690 3.2
5 Lee 730 3.1
> student[3,] ## 3번째 행 전체 선택
name toeic gpa
3 Jung 990 4.5
> student[c(1,3,5),] ## 1, 3, 5번째 행 전체 선택
name toeic gpa
1 Cha 900 4.5
3 Jung 990 4.5
5 Lee 730 3.1
>
> #[] 연산자를 이용한 데이터 프레임의 열 선택
> student[, 2] ## 2번째 열 전체 선택
[1] 900 850 990 690 730
> is.vector(student[,2]) ## 열 선택 시 데이터 프레임이 벡터로 변환
[1] TRUE
> student[, 2, drop = FALSE] ## 데이터 구조 변경 FALSE
toeic
1 900
2 850
3 990
4 690
5 730
> is.data.frame(student[, 2, drop = FALSE])
[1] TRUE
>
> student[, c(2,3)]
toeic gpa
1 900 4.5
2 850 3.8
3 990 4.5
4 690 3.2
5 730 3.1
> student[, c("toeic","gpa")] ## 2, 3번째 열을 변수인 toeic, gpa로 바꿔 입력하여 출력
toeic gpa
1 900 4.5
2 850 3.8
3 990 4.5
4 690 3.2
5 730 3.1
>
> #UsingR 패키지를 설치한 후 로드: reaction.time 데이터가 UsingR 패키지에 포함
> install.packages("UsingR") ## reaction.time 데이터: UsingR 패키지를 설치해야 함
> library(UsingR) ## library: 저장 기능
>
> #UsingR::reaction.time의 처음 6행의 데이터 출력
> head(reaction.time)
age gender control time
1 16-24 F T 1.360075
2 16-24 M T 1.467939
3 16-24 M T 1.512036
4 16-24 F T 1.390647
5 16-24 M T 1.384208
6 16-24 M C 1.393875
>
> #UsingR::reaction.time의 데이터 구조
> str(reaction.time)
'data.frame': 60 obs. of 4 variables:
$ age : Factor w/ 2 levels "16-24","25+": 1 1 1 1 1 1 1 1 1 1 ...
$ gender : Factor w/ 2 levels "F","M": 1 2 2 1 2 2 2 1 1 2 ...
$ control: Factor w/ 2 levels "C","T": 2 2 2 2 2 1 2 2 2 1 ...
$ time : num 1.36 1.47 1.51 1.39 1.38 ...
>
> #UsingR::reaction.time에서 변수 선택
> head(reaction.time[, 2:4]) ## reaction.time의 첫 6행(head) 중 2~4번째 열 출력
gender control time
1 F T 1.360075
2 M T 1.467939
3 M T 1.512036
4 F T 1.390647
5 M T 1.384208
6 M C 1.393875
> head(reaction.time[, c("gender", "control", "time")])
gender control time
1 F T 1.360075
2 M T 1.467939
3 M T 1.512036
4 F T 1.390647
5 M T 1.384208
6 M C 1.393875
> head(reaction.time[2:4]) ## reaction.time이 데이터 프레임이므로 ',(열)' 생략해도 행이 아닌 열 출력
gender control time
1 F T 1.360075
2 M T 1.467939
3 M T 1.512036
4 F T 1.390647
5 M T 1.384208
6 M C 1.393875
> head(reaction.time[c("gender","control","time")])
gender control time
1 F T 1.360075
2 M T 1.467939
3 M T 1.512036
4 F T 1.390647
5 M T 1.384208
6 M C 1.393875
>
> #대괄호 []와 이중 대괄호 [[]] 기호의 차이점
> student[2] ## 대괄호 []: 출력 결과가 데이터 프레임
toeic
1 900
2 850
3 990
4 690
5 730
> student[[2]] ## 이중 대괄호 [[]]: 출력 결과가 벡터
[1] 900 850 990 690 730
> is.data.frame(student[2])
[1] TRUE
> is.vector(student[[2]])
[1] TRUE
>
> # 3.1.2 $ 기호를 이용한 변수의 선택 #
> student$toeic ## 데이터 프레임에서 한 개의 변수를 선택할 때 이용되는 방법
[1] 900 850 990 690 730
> is.vector(student$toeic) ## 위치의 단위가 벡터로 출력됨
[1] TRUE
>
> # 3.1.3 subset()와 select()를 이용한 행과 변수의 선택 #
>
> #UsingR::reaction.time에서 select() 함수에 의한 변수 선택
> head(reaction.time) ## reaction.time 실행 전, UsingR 패키지가 반드시 설치되어 있어야 함
age gender control time
1 16-24 F T 1.360075
2 16-24 M T 1.467939
3 16-24 M T 1.512036
4 16-24 F T 1.390647
5 16-24 M T 1.384208
6 16-24 M C 1.393875
> reaction.time.2 <- subset(reaction.time,
+ select=c("gender", "control", "time"))
> head(reaction.time.2) ## reaction.time.2의 첫 6행 출력
gender control time
1 F T 1.360075
2 M T 1.467939
3 M T 1.512036
4 F T 1.390647
5 M T 1.384208
6 M C 1.393875
>
> reaction.time.2 <- subset(reaction.time, select=gender:time)
## 4개 중 3개의 변수로 구성된 새로운 데이터 프레임 생성
> head(reaction.time.2)
gender control time
1 F T 1.360075
2 M T 1.467939
3 M T 1.512036
4 F T 1.390647
5 M T 1.384208
6 M C 1.393875
>
> #UsingR::reaction.time에서 subset() 함수에 의하여 행 선택
> reaction.time.3 <- subset(reaction.time, (gender=="F" & control=="T"))
## gender가 F이고 control이 T인 두 변수로 구성된 새 데이터 프레임 생성
> reaction.time.3
age gender control time
1 16-24 F T 1.360075
4 16-24 F T 1.390647
8 16-24 F T 1.461187
9 16-24 F T 1.382461
12 16-24 F T 1.331092
15 16-24 F T 1.344506
17 16-24 F T 1.520244
19 16-24 F T 1.348420
20 16-24 F T 1.373000
(이하생략)
>
> #select()와 subset() 함수에 의한 변수와 행 선택
> reaction.time.4 <- subset(reaction.time, (gender=="F" & control=="T"),
+ select=c("gender","control","time"))
## reaction.time.3과 같은 조건에 3개의 변수로만 구성된 새 데이터 프레임
> reaction.time.4
gender control time
1 F T 1.360075
4 F T 1.390647
8 F T 1.461187
9 F T 1.382461
12 F T 1.331092
15 F T 1.344506
17 F T 1.520244
19 F T 1.348420
20 F T 1.373000
(이하생략)
>
> # 3.1.4 sample() 함수 #
>
> #sample() 함수
> sample(1:10, 7) ## 1부터 10까지 10개의 숫자 중 7개를 비복원추출(without replacement)
[1] 4 6 5 2 9 1 3
> sample(1:10, 7, replace=TRUE) ## 1부터 10까지 10개의 숫자 중 7개를 복원추출
[1] 4 10 1 5 7 3 5
> sample(1:10) ## 전체를 비복원추출
[1] 8 5 1 9 3 6 10 2 4 7
> sample(c("S","F"), 10, replace = TRUE)
## 10번의 베르누이 시행 실시 ('성공or실패' 등의 양자택일을 독립시행으로 실시)
[1] "S" "S" "S" "S" "S" "S" "S" "S" "S" "F"
>
> #UsingR::reaction.time에서 랜덤추출
> install.packages("UsingR")
> library(UsingR)
> reaction.time[sample(1:nrow(reaction.time), 10), ]
## 1부터 reaction.time의 행 개수(60)까지 중 10개의 열 전체 비복원추출
age gender control time
9 16-24 F T 1.382461
38 25+ M C 1.245497
36 25+ M C 1.293425
56 25+ M C 1.442599
52 25+ F C 1.316956
47 25+ F C 1.522563
58 25+ F T 1.614979
43 25+ F T 1.499246
16 16-24 M C 1.357869
60 25+ M T 1.466591
> reaction.time[sample(1:nrow(reaction.time), 10), c("gender", "time")]
## 응용: 비복원추출 후 일부 변수(열)만 추출
gender time
43 F 1.499246
47 F 1.522563
36 M 1.293425
3 M 1.512036
49 F 1.313935
13 M 1.369171
1 F 1.360075
48 M 1.462412
34 F 1.447160
26 F 1.472212
>
>
> #### 3.2 데이터 프레임에서 새로운 변수 추가 및 삭제 ####
>
> # 3.2.1 데이터 프레임에서 새로운 변수 추가 #
>
> #$기호를 이용
> name <- c("Cha", "Park", "Jung", "Kim", "Lee")
> rScore <- c(58, 66, 92, 78, 88)
> pythonScore <- c(88, 55, 98, 75, 58)
> javaScore <- c(66, 88, 90, 78, 66)
> record <- data.frame(name, rScore, pythonScore, javaScore, stringsAsFactors = FALSE)
> record
name rScore pythonScore javaScore
1 Cha 58 88 66
2 Park 66 55 88
3 Jung 92 98 90
4 Kim 78 75 78
5 Lee 88 58 66
> str(record)
'data.frame': 5 obs. of 4 variables:
$ name : chr "Cha" "Park" "Jung" "Kim" ...
$ rScore : num 58 66 92 78 88
$ pythonScore: num 88 55 98 75 58
$ javaScore : num 66 88 90 78 66
>
> record$sumScore <- record$rScore + record$pythonScore + record$javaScore
## 여기서 record$를 제외할 경우 sumScore라는 별도의 변수가 생성
> record$meanScore <- (record$rScore + record$pythonScore + record$javaScore)/3
## 즉, 데이터 프레임의 변수가 아닌 R에서의 변수로 나오게 됨
> record
name rScore pythonScore javaScore sumScore meanScore
1 Cha 58 88 66 212 70.66667
2 Park 66 55 88 209 69.66667
3 Jung 92 98 90 280 93.33333
4 Kim 78 75 78 231 77.00000
5 Lee 88 58 66 212 70.66667
>
> #within() 함수 이용
> within(record, {
+ sumScore <- rScore + pythonScore + javaScore
+ meanScore <- (rScore + pythonScore + javaScore)/3
+ }) ## 데이터 프레임명 기록하지 않아도 within() 함수로 변수 추가 가능
name rScore pythonScore javaScore sumScore meanScore
1 Cha 58 88 66 212 70.66667
2 Park 66 55 88 209 69.66667
3 Jung 92 98 90 280 93.33333
4 Kim 78 75 78 231 77.00000
5 Lee 88 58 66 212 70.66667
>
>
> # 3.2.2 데이터 프레임에서 새로운 변수 삭제 #
> name <- c("Cha", "Park", "Jung", "Kim", "Lee")
> gender <- c("M", "F", "M", "F", "F")
> toeic <- c(750, 680, 990, 850, 900)
> gpa <- c(4.5, 3.8, 4.2, 3.2, 3.1)
> studentScore <- data.frame(name, gender, toeic, gpa, stringsAsFactors = FALSE)
> studentScore
name gender toeic gpa
1 Cha M 750 4.5
2 Park F 680 3.8
3 Jung M 990 4.2
4 Kim F 850 3.2
5 Lee F 900 3.1
> subset(studentScore, select=c(-gender, -toeic))
## studentScore 데이터 프레임에서 gender, toeic 변수 삭제
name gpa
1 Cha 4.5
2 Park 3.8
3 Jung 4.2
4 Kim 3.2
5 Lee 3.1
'데이터 [Data] > R' 카테고리의 다른 글
R 데이터 가공: 결측값 처리, 그룹별 요약통계량 계산, 변환 (0) | 2021.04.29 |
---|---|
R 데이터 가공: 정렬, 결합 및 분리 (0) | 2021.04.28 |
R 데이터 구조: 데이터 프레임, 리스트, 데이터 테이블 (0) | 2021.04.24 |
R 데이터 구조: 행렬, 배열 (0) | 2021.04.22 |
R 데이터 구조: 벡터, 팩터 (0) | 2021.04.20 |
댓글