벡터 함수는 기초적으로 알아야 하는 함수이다. 모델을 돌리기 전, 데이터 탐색을 할 때, 벡터 함수를 미리 돌려 보고, 데이터가 맞는지 검증을 하게 된다. 물론 집계할 수 있는 colSomes, rowSums와 같은 함수도 있다. 이 것에 대한 내용을 알게 되면, 향후 dplyr 에서 summarise나 mutate 에서 자유로이 계산 할 수 있는 장점을 가지고 있다.
3.8 벡터 함수
R의 큰 장점중 하나는 반복문과 첨자 없이 전체 벡터에 대한 함수를 연산할 수 있다는 접입니다. 주요 벡터 함수는 아래 표와 같습니다. 다음 숫자 벡터를 사용해 해당 함수를 실행해 보십시오.
y<-c(8,3,5,7,6,6,8,9,2,3,9,4,10,4,11)
일부 벡터 함수는 1개의 값 만을 출력 하기도 합니다.
mean(y)
## [1] 6.333333
연산 | 의미 |
max(x) | x의 최대값 |
min(x) | x의 최소값 |
sum(x) | 모든 x값의 합 |
mean(x) | x의 산술평균 |
median(x) | x의 중위수 |
range(x) | x의 최소값과 최대값의 차이 |
var(x) | x의 표본분산 |
cor(x,y) | 벡터 x와 y 와 상관관계 |
sort(x) | x 값의 정렬 |
rank(x) | x값을 순위 벡터 |
order(x) | 오름차순으로 x를 정렬하는 순열을 포함한 정수 벡터 |
quantile(x) | x 값의 사분위수를 나타내는 벡터 |
cumsum(x) | 설정된 지점까지 모든 요소의 합을 포함하는 벡터 |
cumprod(x) | 설정된 지점까지 모든 요소의 합을 포함하는 벡터 |
colMeans(x) | 데이터 프레임 또는 행렬 x의 열 평균 |
colMeans(x) | 데이터 프레임 또는 행렬 x의 열 평균 |
colSums(x) | 데이터 프레임 또는 행렬 x의 열 합계 |
rowMeans(x) | 데이터 프레임 또는 행렬 x의 행 평균 |
rowSums(x) | 데이터 프레임 또는 행렬 x의 행 합 |
2 개의 값을 생성하는 벡터 함수도 있으며 예제의 실행 결과는 최소값 2와 최대값 11일 입니다.
range(y)
## [1] 2 11
R에서 가장 유용한 벡터 함수는 table 입니다. 이 함수가 얼마나 유용한지는 실제로 사용해봐야 압니다.
아래는 벡터 counts는 10,000개의 음이항 분포를 따르는 임의의 정수 입니다.
이 값을 10,000개의 잎에 남아 있는 곰팡이 병변의 수라고 가정 합니다.
counts <- rnbinom(10000, mu=0.92, size = 1.1)
counts 벡터의 첫 30개 값은 다음과 같습니다.
counts[1:30]
## [1] 0 0 2 1 0 0 3 0 0 0 3 1 0 0 3 4 1 0 0 0 0 0 0 1 1 2 0 0 2 1
10,000 개의 숫자로 구성된 벡터에서 각 숫자는 몇 개인가? 이 작업은 상당한 연산이 필요하지만 R을 사용하면 쉽게 계산 할 수 있습니다.
table(counts)
## counts
## 0 1 2 3 4 5 6 7 8 9 10 12 18
## 5163 2510 1246 587 262 131 48 24 19 4 4 1 1
0은 5천개 정도 있고 , 1은 2천 개 정도가 있습니다. 데이터를 돌리때 마다 숫자는 바뀝니다.
예제 1
아래는 각 도/연도별(2001~2020) 출생 인원을 예시로 나타낸 표입니다. 출생 년도별 총 인원을 구하시고, 시/도별 2001~2020년까지 총 출생 인원과 평균인원을 구하십시오.
행정구역 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 |
서울특별시 | 114,764 | 102,008 | 101,227 | 99,828 | 90,468 | 93,922 |
부산광역시 | 35,848 | 30,767 | 30,117 | 28,231 | 25,681 | 25,881 |
대구광역시 | 28,111 | 24,260 | 24,513 | 23,259 | 20,804 | 20,360 |
인천광역시 | 30,494 | 26,775 | 26,832 | 25,092 | 23,026 | 23,711 |
광주광역시 | 18,198 | 16,036 | 15,954 | 14,729 | 13,327 | 13,679 |
대전광역시 | 17,290 | 15,631 | 15,712 | 15,024 | 13,950 | 14,489 |
울산광역시 | 13,600 | 11,666 | 11,720 | 11,151 | 10,469 | 10,740 |
경기도 | 126,264 | 116,854 | 120,433 | 117,812 | 109,533 | 115,111 |
강원도 | 16,873 | 15,314 | 14,349 | 13,776 | 12,657 | 12,455 |
충청북도 | 17,322 | 15,329 | 14,650 | 14,331 | 13,164 | 13,366 |
충청남도 | 21,962 | 19,059 | 18,627 | 18,640 | 17,521 | 18,625 |
전라북도 | 22,192 | 19,215 | 18,437 | 17,257 | 15,745 | 15,571 |
전라남도 | 22,588 | 19,242 | 18,333 | 17,256 | 15,818 | 15,905 |
경상북도 | 30,500 | 26,022 | 25,447 | 23,553 | 22,339 | 22,567 |
경상남도 | 36,475 | 32,203 | 32,102 | 30,922 | 28,471 | 29,524 |
제주특별자치도 | 7,453 | 6,530 | 6,583 | 6,097 | 5,734 | 5,853 |
아래와 링크와 같이 데이터 셋을 받고, 데이터를 로딩 합니다.
library(readxl)
born <- read_excel("born.xlsx")
str(born)
## tibble [16 × 21] (S3: tbl_df/tbl/data.frame)
## $ 행정구역: chr [1:16] "서울특별시" "부산광역시" "대구광역시" "인천광역시" ...
## $ 2001 : num [1:16] 114764 35848 28111 30494 18198 ...
## $ 2002 : num [1:16] 102008 30767 24260 26775 16036 ...
## $ 2003 : num [1:16] 101227 30117 24513 26832 15954 ...
## $ 2004 : num [1:16] 99828 28231 23259 25092 14729 ...
## $ 2005 : num [1:16] 90468 25681 20804 23026 13327 ...
## $ 2006 : num [1:16] 93922 25881 20360 23711 13679 ...
## $ 2007 : num [1:16] 101249 28426 22295 26712 14810 ...
## $ 2008 : num [1:16] 94736 26670 20562 25365 13890 ...
## $ 2009 : num [1:16] 89594 25110 19399 24379 13101 ...
## $ 2010 : num [1:16] 93266 27415 20557 25752 13979 ...
## $ 2011 : num [1:16] 91526 27759 20758 26118 13916 ...
## $ 2012 : num [1:16] 93914 28673 21472 27781 14392 ...
## $ 2013 : num [1:16] 84066 25831 19340 25560 12729 ...
## $ 2014 : num [1:16] 83711 26190 19361 25786 12729 ...
## $ 2015 : num [1:16] 83005 26645 19438 25491 12441 ...
## $ 2016 : num [1:16] 75536 24906 18298 23609 11580 ...
## $ 2017 : num [1:16] 65389 21480 15946 20445 10120 ...
## $ 2018 : num [1:16] 58074 19152 14400 20087 9105 ...
## $ 2019 : num [1:16] 53673 17049 13233 18522 8364 ...
## $ 2020 : num [1:16] 47445 15058 11193 16040 7318 ...
데이터 셋을 보면 1번 컬럼은 character Type이고, 나머지는 numbering 타입입니다.
따라서 데이터를 데이터를 계산 할때는 1번 컬럼을 빼고 계산 해야 합니다. 빼는 방법은 대괄호 치고 원하는 컬럼 번호를 선택 born[2:21]
하는 것입니다.
# 데이터 매트릭스로 바꾸어서 계산
temp <- data.frame(t(data.matrix(c("합계", colSums(born[2:21])))))
# rbind를 하기 위한 데이터 대치
colnames(temp) <- colnames(born)
# rbind를 총합 한 데이터 추가
born <- rbind(born,temp)
데이터 계산을 할때, data.matrix에 첫번째 컬럼을 character로 넣고, 나머지는 컬럼을 계산 합니다. 그리고, 데이터가 세로로 만들어 지기 때문에, 이것을 가로로 만들어야 합니다. 이것을 계산할때 전치행렬 t(transpose)
를 해야 합니다.data.matrix를 계산하고나면 컬럼 이름이 원래 이름과 다르기 때문에, born 데이터 프레임의 이름을 가져와서, data.matrix로 바꾼 것에다 다시 컬럼 명을 넣어 주어야 합니다.
데이터 계산이 끝나면, 계산한 데이터가 charater로 바뀌었기 때문에, 데이터 타입을 integer로 바꾸어야 합니다.
library(dplyr)
# 데이터 타입을 바꾸기
born <- born %>% mutate_at(c(2:21), as.integer)
데이터 타입을 바꾸고 나면 rowSums()
열을 계산합니다. 열은 dplyr 패키지로 아주 간단하게 계산이 됩니다.
# 지역별 출산 합계
born <- born %>%
mutate(출산합계 = rowSums(born[2:21]))
# 지역별 출산 평균
born <- born %>%
mutate(출산평균 = rowMeans(born[2:21]))
head(born)
## # A tibble: 6 × 23
## 행정구역 `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009` `2010`
## <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1 서울특… 114764 102008 101227 99828 90468 93922 101249 94736 89594 93266
## 2 부산광… 35848 30767 30117 28231 25681 25881 28426 26670 25110 27415
## 3 대구광… 28111 24260 24513 23259 20804 20360 22295 20562 19399 20557
## 4 인천광… 30494 26775 26832 25092 23026 23711 26712 25365 24379 25752
## 5 광주광… 18198 16036 15954 14729 13327 13679 14810 13890 13101 13979
## 6 대전광… 17290 15631 15712 15024 13950 14489 15780 14856 13915 14314
## # … with 12 more variables: `2011` <int>, `2012` <int>, `2013` <int>,
## # `2014` <int>, `2015` <int>, `2016` <int>, `2017` <int>, `2018` <int>,
## # `2019` <int>, `2020` <int>, 출산합계 <dbl>, 출산평균 <dbl>
댓글 없음:
댓글 쓰기