59doit
[ R ] 함수의 정의 본문
함수의 정의
사용자 정의 함수: 사용자가 직접 함수 내에 필요한 코드를 작성하여 필요한 경우 함수를 호출하여 사용하기 위하여 작성한 함수
함수명 <- function(매개변수) { 실행문 }
(1) 사용자 정의 함수
ex ) 매개변수가 없는 사용자 함수 정의
f1 <- function() { cat("매개변수가 없는 함수") } f1() # 매개변수가 없는 함수 |
- 매개변수가 없는 함수는 ‘함수명()’ 형태로 함수명에 빈 괄호를 붙여 호출
- 정의된 함수를 호출하지 않으면 함수의 내용은 실행되지 않는다.
ex ) 결과를 반환하는 사용자 함수 정의
f3 <- function(x, y) { add <- x + y return(add) } add <- f3(10, 20) |
- return()함수: 사용자 정의 함수 내에 있는 값을 함수를 호출하는 곳으로 반환하는 역할
(2) 기술통계량을 계산하는 함수 정의
요약통계량, 빈도 수 등의 기술통계량을 계산하는 함수를 정의
ex ) 기본함수를 이용하여 요약통계량과 빈도수 구하기
#1 파일 불러오기
test <- read.csv("C:/test.csv", header = TRUE) head(test) # A B C D E # 1 2 4 4 2 2 # 2 1 2 2 2 2 # 3 2 3 4 3 3 # 4 3 5 5 3 3 # 5 3 2 4 4 4 # 6 4 3 3 4 2 |
#2 요약 통계량 구하기
summary(test) # A B C D E # Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.00 Min. :1.000 # 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:3.000 1st Qu.:2.00 1st Qu.:3.000 # Median :3.000 Median :3.000 Median :4.000 Median :2.00 Median :4.000 # Mean :2.734 Mean :2.908 Mean :3.622 Mean :2.51 Mean :3.386 # 3rd Qu.:3.000 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:3.00 3rd Qu.:4.000 # Max. :5.000 Max. :5.000 Max. :5.000 Max. :4.00 Max. :5.000 |
#3특정 변수의 빈도수 구하기
table(test$A) # 1 2 3 4 5 # 30 133 156 80 3 |
#4 각 칼럼 단위의 빈도수와 최대값, 최소값 계산을 위한 사용자 함수 정의하기
data_pro <- function(x) { for(idx in 1:length(x)) { cat(idx, "번째 칼럼의 빈도 분석 결과") print(table(x[idx])) cat("\n") } for(idx in 1:length(x)) { f <- table(x[idx]) cat(idx, "번째 칼럼의 최대값/최소값\n") cat("max = ", max(f), "min = ", min(f), "\n") } } data_pro(test) # 1 번째 칼럼의 빈도 분석 결과 # 1 2 3 4 5 # 30 133 156 80 3 # # 2 번째 칼럼의 빈도 분석 결과 # 1 2 3 4 5 # 16 150 98 131 7 # # 3 번째 칼럼의 빈도 분석 결과 # 1 2 3 4 5 # 3 74 72 176 77 # # 4 번째 칼럼의 빈도 분석 결과 # 1 2 3 4 # 30 178 153 41 # # 5 번째 칼럼의 빈도 분석 결과 # 1 2 3 4 5 # 8 81 107 160 46 # # 1 번째 칼럼의 최대값/최소값 # max = 156 min = 3 # 2 번째 칼럼의 최대값/최소값 # max = 150 min = 7 # 3 번째 칼럼의 최대값/최소값 # max = 176 min = 3 # 4 번째 칼럼의 최대값/최소값 # max = 178 min = 30 # 5 번째 칼럼의 최대값/최소값 # max = 160 min = 8 |
- 사용자 정의함수 data_pro(): 컬럼 단위로 빈도수, 최대값, 최소값 계산
ex ) 분산과 표준편차를 구하는 사용자 함수 정의
표본분산: x변량을 대상으로 “변량의 차의 제곱이 합 / (변량의 개수-1) “
표본분산 식: var <-sum((x-산술평균)^2) / (length(x)-1)
표본표준편차 식: sqrt(var)
x <- c(7, 5, 12, 9, 15, 6) var_sd <- function(x) { var <- sum((x - mean(x)) ^ 2) / (length(x) - 1) sd <- sqrt(var) cat("표본분산: ", var, "\n") cat("표본표준편차: ",sd) } var_sd(x) # 표본분산: 14.8 # 표본표준편차: 3.847077 |
(3) 피타고라스와 구구단 함수 정의
ex ) 피타고라스식 정의 함수 만들기
ex ) 구구단 출력 함수 만들기
(4) 결측치 포함 자료의 평균 계산 함수 정의
결측치 데이터(NA)를 포함하는 데이터의 평균을 구하기 위해서는 먼저 결측치를 처리한 후 평균을 계산해야 한다.
ex ) 결측치를 포함하는 자료를 대상으로 평균 구하기
# 1 결측치(NA)를 포함하는 데이터 생성
data <- c(10, 20, 5, 4, 40, 7, NA, 6, 3, NA, 2, NA) |
# 2 결측치 데이터를 처리하는 함수 정의
na <- function(x) { # 1차: NA 제거 print(x) print(mean(x, na.rm = T)) # 2차: NA를 0으로 대체 data = ifelse(!is.na(x), x, 0) print(data) print(mean(data)) # 3차: NA를 평균으로 대체 data2 = ifelse(!is.na(x), x, round(mean(x, na.rm = TRUE), 2)) print(data2) print(mean(data2)) } |
2에서
1차: NA제거하고 평균 산출
2차: NA를 0으로 대체하여 평균을 구한다.
3차: NA를 평균으로 대체하여 평균을 구한다
# 3 결측치 처리를 위한 사용자 함수 호출
na(data) # [1] 10.77778 # [1] 10 20 5 4 40 7 0 6 3 0 2 0 # [1] 8.083333 # [1] 10.00 20.00 5.00 4.00 40.00 7.00 10.78 6.00 3.00 10.78 2.00 10.78 # [1] 10.77833 |
(5) 몬테카를로 시뮬레이션 함수 정의
몬테카를로 시뮬레이션은 현실적으로 불가능한 문제의 해답을 얻기 위해 난수의 확률 분포를 이용하는 모의 시험으로 근사적 해를 구하는 기법
ex )동전 앞면과 뒷면에 대한 난수 확률분포의 기대확률 모의시험
# 1 동전 앞면과 뒷면의 난수 확률분포 함수 정의
coin <- function(n){ r<-runif(n,min=0,max=1) result<-numeric() for(i in 1:n){ if(r[i]<=0.5) result[i]<-0 else result[i]<-1 } return(result) } |
# 2 동전 던지기 횟수가 10회인 경우 앞면(0)과 뒷면(1)이 나오는 vector 값
coin(10) # [1] 0 0 0 1 1 0 1 0 0 0 |
# 3 몬테카를로 시뮬레이션 함수 정의
montaCoin <- function(n) { cnt <- 0 for(i in 1:n) { cnt <- cnt + coin(1) } result <- cnt / n return(result) } |
# 4 몬테카를로 시뮬레이션 함수 호출
montaCoin(10) # [1] 0.6 montaCoin(30) # [1] 0.2333333 montaCoin(100) # [1] 0.42 montaCoin(1000) # [1] 0.483 montaCoin(10000) # [1] 0.5057 |
- runif() 함수: 난수 발생 함수
'Programming > R' 카테고리의 다른 글
[ R ] dplyr 패키지 활용 #1 (0) | 2022.11.19 |
---|---|
[ R ] 주요 내장함수 (0) | 2022.11.18 |
[ R ] 연산자 & 조건문 & 반복문 (0) | 2022.11.17 |
[ R ] 연습문제 (3) (0) | 2022.11.17 |
[ R ] 데이터 입출력 (0) | 2022.11.17 |