예제를 사용한 R 프로그래밍의 기능
⚡ 스마트 요약
R 패키지의 함수들은 일련의 명령어를 하나의 이름으로 묶어주기 때문에, 반복적인 작업은 한 번의 호출로 실행됩니다. 내장된 수학 및 통계 도우미 함수, 사용자 정의 함수, 환경 변수 등을 활용할 수 있습니다.ping조건부 인수에 대해서는 여기에서 예제와 함께 다룹니다.

R의 함수란 무엇입니까?
A 기능는 프로그래밍 환경에서 일련의 명령입니다. 프로그래머는 피하기 위해 함수를 만듭니다. 같은 작업을 반복하는 것, 또는 감소 복잡성.
함수는 다음과 같아야 합니다.
- 특정 작업을 수행하기 위해 작성됨
- 인수를 포함할 수도 있고 포함하지 않을 수도 있습니다.
- 시체를 포함
- 하나 이상의 값을 반환할 수도 있고 반환하지 않을 수도 있습니다.
함수에 대한 일반적인 접근 방식은 인수 부분을 다음과 같이 사용하는 것입니다. 입력, 먹이를 주다 몸 일부를 반환하고 마지막으로 출력. 함수의 구문은 다음과 같습니다.
function (arglist) { #Function body }
R 중요한 내장 함수
R에는 많은 내장 함수가 있습니다. R은 입력 매개변수를 값이나 위치별로 함수 인수와 일치시킨 다음 함수 본문을 실행합니다. 함수 인수는 기본값을 가질 수 있습니다. 이러한 인수를 지정하지 않으면 R은 기본값을 사용합니다.
주의 사항:
콘솔에서 함수 자체의 이름을 실행하면 함수의 소스 코드를 볼 수 있습니다.
Typing 대괄호 없이 함수 이름을 입력하면 아래 콘솔에 표시된 것처럼 해당 함수의 소스 코드가 출력됩니다.
우리는 세 가지 기능 그룹이 작동하는 것을 볼 것입니다
- 일반 기능
- 수학 기능
- 통계 기능
일반 기능
우리는 이미 cbind(), rbind(), range()와 같은 일반적인 함수들에 익숙합니다. 종류()그리고 `order()`와 같은 함수들은 각각 특정한 작업을 수행하며, 인수를 받아 결과를 반환합니다. 다음은 반드시 알아야 할 중요한 함수들입니다.
diff() 함수
작업하면 시계열, 당신은 그들의 시리즈를 고정해야 지연 값. 에이 고정 프로세스 시간에 따른 평균, 분산 및 자기상관을 일정하게 유지할 수 있습니다. 이는 주로 시계열 예측의 정확도를 향상시킵니다. 이러한 작업은 `diff()` 함수를 사용하여 수행할 수 있습니다. 추세가 있는 임의의 시계열 데이터를 생성한 다음 `diff()` 함수를 사용하여 시계열을 정상화할 수 있습니다. `diff()` 함수는 벡터 하나를 인수로 받아 적절한 지연 및 반복 차분을 반환합니다.
주의 사항우리는 종종 무작위 데이터를 생성해야 하지만, 학습 및 비교를 위해서는 모든 기기에서 동일한 숫자가 생성되기를 원합니다. 모든 기기에서 동일한 데이터가 생성되도록 하기 위해, 임의의 값 123을 사용하여 `set.seed()` 함수를 호출합니다. `set.seed()`는 의사 난수 생성기의 시작점을 고정하여 모든 기기에서 동일한 시퀀스를 생성하도록 합니다. `set.seed()`를 사용하지 않으면 실행할 때마다 다른 시퀀스가 생성됩니다.
set.seed(123) ## Create the data x = rnorm(1000) ts <- cumsum(x) ## Stationary the serie diff_ts <- diff(ts) par(mfrow=c(1,2)) ## Plot the series plot(ts, type='l') plot(diff(ts), type='l')
아래 두 패널은 원래의 누적 시계열과 차분된 시계열을 나란히 보여주는데, 차분된 시계열은 이제 일정한 평균값을 중심으로 변동합니다.
길이() 함수
많은 경우, 계산이나 for 루프에서 사용하기 위해 벡터의 길이를 알아야 할 필요가 있습니다. `length()` 함수는 벡터 `x`의 행 수를 계산합니다. 다음 코드는 `cars` 데이터셋을 불러와 행 수를 반환합니다.
주의 사항`length()` 함수는 벡터의 요소 수를 반환합니다. 이 함수가 전달될 경우 매트릭스 데이터프레임의 경우 열의 개수가 반환됩니다.
dt <- cars
## number columns
length(dt)
출력:
## [1] 1
## number rows
length(dt[,1])
출력:
## [1] 50
연산 함수
일반적인 도우미 기능 외에도 R은 벡터의 각 요소에 대해 개별적으로 연산을 수행하는 다양한 수학 함수를 제공합니다.
| Opera바위 산 | 기술설명 |
|---|---|
| abs (x) | x의 절대값을 취합니다. |
| 로그(x, 밑수=y) | 밑이 y인 x의 로그를 취합니다. 밑이 지정되지 않은 경우 자연 로그를 반환합니다. |
| 경험치(x) | x의 지수를 반환합니다. |
| sqrt (x) | x의 제곱근을 반환합니다. |
| 팩토리얼(x) | x의 계승값을 반환합니다(x!) |
# sequence of number from 44 to 55 both including incremented by 1 x_vector <- seq(45,55, by = 1) #logarithm log(x_vector)
출력:
## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826 ## [8] 3.951244 3.970292 3.988984 4.007333
#exponential
exp(x_vector)
#squared root
sqrt(x_vector)
출력:
## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428 ## [8] 7.211103 7.280110 7.348469 7.416198
#factorial
factorial(x_vector)
출력:
## [1] 1.196222e+56 5.502622e+57 2.586232e+59 1.241392e+61 6.082819e+62 ## [6] 3.041409e+64 1.551119e+66 8.065818e+67 4.274883e+69 2.308437e+71 ## [11] 1.269640e+73
통계 함수
수학 함수가 값을 변환하는 반면, 통계 함수는 값을 요약합니다. R의 기본 설치에는 다양한 통계 함수가 포함되어 있습니다. 이 튜토리얼에서는 가장 중요한 함수들을 간략하게 살펴보겠습니다.
기본 통계 함수
| Opera바위 산 | 기술설명 |
|---|---|
| 평균(x) | x의 평균 |
| 중앙값(x) | x의 중앙값 |
| 변수(x) | x의 분산 |
| SD(x) | x의 표준편차 |
| 규모(x) | x의 표준 점수(z-점수) |
| 분위수(x) | x의 사분위수 |
| 요약(x) | x 요약: 평균, 최소, 최대 등. |
speed <- dt$speed
speed
# Mean speed of cars dataset
mean(speed)
출력:
## [1] 15.4
# Median speed of cars dataset
median(speed)
출력:
## [1] 15
# Variance speed of cars dataset
var(speed)
출력:
## [1] 27.95918
# Standard deviation speed of cars dataset
sd(speed)
출력:
## [1] 5.287644
# Standardize vector speed of cars dataset
head(scale(speed), 5)
출력:
## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489
# Quantile speed of cars dataset
quantile(speed)
출력:
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset
summary(speed)
출력:
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0
지금까지 우리는 R 내장 함수를 많이 배웠습니다.
주의 사항조심하세요 인수의 종류즉, 숫자, 부울 또는 문자열일 수 있습니다. 예를 들어 문자열 값을 전달해야 하는 경우 문자열을 따옴표로 묶어야 합니다. "ABC"처럼요.
R에 함수 쓰기
어떤 경우에는 특정 작업을 수행해야 하는데 기성 함수가 존재하지 않아 직접 함수를 작성해야 할 때가 있습니다. 사용자 정의 함수는 다음과 같은 특징을 가집니다. name, 인수 및 몸.
function.name <- function(arguments) { computations on the arguments some other code }
주의 사항: 좋은 방법은 내장 함수와 다른 사용자 정의 함수의 이름을 지정하는 것입니다. 혼란을 방지합니다.
하나의 인수 함수
다음 코드 조각에서는 간단한 사각형 함수를 정의합니다. 이 함수는 값을 받아들이고 값의 제곱을 반환합니다.
square_function<- function(n) { # compute the square of integer `n` n^2 } # calling the function and passing value 4 square_function(4)
Code 설명
- 함수 이름은 square_function입니다. 그것은 우리가 원하는 대로 불릴 수 있습니다.
- 인수 "n"을 받습니다. 우리 사용자가 정수, 벡터 또는 행렬을 전달할 수 있도록 변수 유형을 지정하지 않았습니다.
- 이 함수는 입력 "n"을 사용하여 입력의 제곱을 반환합니다. 함수 사용이 끝나면 rm() 함수를 사용하여 해당 함수를 제거할 수 있습니다.
# 함수를 만든 후
rm(square_function) square_function
콘솔에서 함수가 존재하지 않는다는 오류 메시지를 볼 수 있습니다. 오류: 객체 'square_function'을 찾을 수 없습니다.
환경 Scoping
R에서는 환경 함수, 변수, 데이터프레임 등과 같은 객체들의 모음입니다.
R은 RStudio를 시작할 때마다 환경을 엽니다.
사용 가능한 최상위 환경은 지구 환경R_GlobalEnv라고 불리는 것이 있습니다. 그리고 우리는 다음을 가지고 있습니다. 지역 환경.
현재 환경의 내용을 나열할 수 있습니다.
ls(environment())
산출
## [1] "diff_ts" "dt" "speed" "square_function" ## [5] "ts" "x" "x_vector"
R_GlobalEnv에서 생성된 모든 변수와 함수를 볼 수 있습니다.
위 목록은 RStudio에서 실행한 과거 코드에 따라 달라질 수 있습니다.
참고 nsquare_function 함수의 인수는 이 전역 환경에 없습니다.
각 함수마다 새로운 환경이 생성됩니다. 위 예시에서 square_function() 함수는 내부에 새로운 환경을 생성합니다. 지구 환경.
차이점을 명확히 하기 위해 글로벌 지방의 환경이라는 개념을 예시를 통해 살펴보겠습니다.
이 함수는 x 값을 인수로 사용하고 이를 y에 추가하여 함수 외부와 내부를 정의합니다.
함수 f는 출력 15를 반환합니다. 이는 y가 전역 환경에 정의되어 있기 때문입니다. 전역 환경에 정의된 모든 변수는 로컬에서 사용할 수 있습니다. 변수 y는 모든 함수 호출 중에 값 10을 가지며 언제든지 액세스할 수 있습니다.
변수 y가 함수 내부에 정의되면 어떤 일이 발생하는지 살펴보겠습니다.
rm r을 사용하여 이 코드를 실행하기 전에 `y`를 삭제해야 합니다.
f(15)를 호출할 때도 출력은 5이지만 값 y를 인쇄하려고 하면 오류를 반환합니다. 변수 y는 전역 환경에 없습니다.
마지막으로, R은 가장 최근의 변수 정의를 사용하여 함수 본문 내부로 전달합니다. 다음 예를 고려해 보겠습니다.
R은 함수 본문 내부에 명시적으로 변수를 생성했기 때문에 함수 외부에 정의된 y 값을 무시합니다.
다중 인수 기능
둘 이상의 인수를 사용하여 함수를 작성할 수 있습니다. "times"라는 함수를 생각해 보세요. 두 변수를 곱하는 간단한 함수입니다.
times <- function(x,y) {
x*y
}
times(2,4)
출력:
## [1] 8
언제 함수를 작성해야 할까요?
데이터 과학자는 반복적인 작업을 많이 해야 합니다. 대부분의 경우 코드 덩어리를 반복적으로 복사하고 붙여넣습니다. 예를 들어, 알고리즘을 실행하기 전에 변수를 정규화하는 것이 강력히 권장됩니다. 기계 학습 연산. 변수를 정규화하는 공식은 다음과 같습니다.
우리는 R에서 min() 및 max() 함수를 사용하는 방법을 이미 알고 있습니다. 우리는 tibble 라이브러리를 사용하여 데이터 프레임을 생성합니다. Tibble은 지금까지 처음부터 데이터 세트를 생성하는 가장 편리한 기능입니다.
library(tibble) # Create a data frame data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), )
위에서 설명한 함수를 계산하기 위해 두 단계로 진행하겠습니다. 첫 번째 단계에서는 c1의 스케일링 값인 c1_norm이라는 변수를 생성합니다. 두 번째 단계에서는 c1_norm의 코드를 복사하여 붙여넣고 c2와 c3로 바꾸기만 하면 됩니다.
c1 열이 포함된 함수의 세부정보:
지명자: : data_frame$c1 -min(data_frame$c1))
분모: 최대(data_frame$c1)-min(data_frame$c1))
따라서 이를 나누어 c1 열의 정규화된 값을 얻을 수 있습니다.
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
c1_norm, c2_norm 및 c3_norm을 생성할 수 있습니다.
Create c1_norm: rescaling of c1
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
# show the first five values
head(data_frame$c1_norm, 5)
출력:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
효과가있다. 복사해서 붙여넣을 수 있어요
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
그런 다음 c1_norm을 c2_norm으로 변경하고 c1을 c2로 변경합니다. c3_norm을 생성하기 위해 동일한 작업을 수행합니다.
data_frame$c2_norm <- (data_frame$c2 - min(data_frame$c2))/(max(data_frame$c2)-min(data_frame$c2)) data_frame$c3_norm <- (data_frame$c3 - min(data_frame$c3))/(max(data_frame$c3)-min(data_frame$c3))
우리는 변수 c1, c2 및 c3의 크기를 완벽하게 조정했습니다.
하지만 이 방법은 오류가 발생하기 쉽습니다. 복사 후 붙여넣기할 때 열 이름을 변경하는 것을 잊어버릴 수 있기 때문입니다. 따라서 동일한 코드를 두 번 이상 붙여넣어야 할 때마다 함수를 작성하는 것이 좋습니다. 이렇게 하면 코드를 수식으로 재구성하고 필요할 때마다 호출할 수 있습니다. 자체 함수를 작성하려면 다음이 필요합니다.
- 이름: 정규화.
- 인수 수: 계산에 사용하는 열인 하나의 인수만 필요합니다.
- 본문: 이것은 단순히 우리가 반환하려는 공식입니다.
Normalize 함수를 생성하기 위해 단계별로 진행하겠습니다.
단계 1) 분자는 x – min(x)입니다. R에서는 다음과 같이 분자를 변수에 저장할 수 있습니다.
nominator <- x-min(x)
단계 2) 분모인 max(x) – min(x)를 계산합니다. 1단계와 같은 방식으로 계산 결과를 변수에 저장할 수 있습니다.
denominator <- max(x)-min(x)
단계 3) 우리는 지명자와 분모 사이의 나눗셈을 수행합니다.
normalize <- nominator/denominator
단계 4) 호출 함수에 값을 반환하려면 return() 내부에 정규화를 전달하여 함수의 출력을 가져와야 합니다.
return(normalize)
단계 5) 이제 wrap 함수를 사용할 준비가 되었습니다.ping 괄호 안의 모든 것.
normalize <- function(x){ # step 1: create the nominator nominator <- x-min(x) # step 2: create the denominator denominator <- max(x)-min(x) # step 3: divide nominator by denominator normalize <- nominator/denominator # return the value return(normalize) }
변수 c1을 사용하여 함수를 테스트해 보겠습니다.
normalize(data_frame$c1)
완벽하게 작동합니다. 우리는 첫 번째 함수를 만들었습니다.
함수는 반복적인 작업을 수행하는 보다 포괄적인 방법입니다. 아래와 같이 여러 열에 걸쳐 정규화 함수를 사용할 수 있습니다.
data_frame$c1_norm_function <- normalize (data_frame$c1) data_frame$c2_norm_function <- normalize (data_frame$c2) data_frame$c3_norm_function <- normalize (data_frame$c3)
이 예시는 간단하지만, 공식의 강력함을 충분히 알 수 있습니다. 위의 코드는 읽기 쉽고 코드를 붙여넣을 때 발생하는 오류를 방지합니다.
조건이 있는 함수
normalize() 함수는 항상 동일한 작업을 수행합니다. 하지만 때로는 함수가 다양한 결과를 반환하도록 조건을 추가해야 할 필요가 있습니다.
기계 학습 작업에서는 기차 세트와 테스트 세트 간에 데이터 세트를 분할해야 합니다. 열차 세트를 사용하면 알고리즘이 데이터로부터 학습할 수 있습니다. 모델의 성능을 테스트하기 위해 테스트 세트를 사용하여 성능 측정값을 반환할 수 있습니다. R에는 두 개의 데이터 세트를 생성하는 기능이 없습니다. 이를 위해 우리 자신의 함수를 작성할 수 있습니다. 우리 함수는 두 개의 인수를 취하며 Split_data()라고 합니다. 기본 개념은 간단합니다. 데이터 세트의 길이(예: 관측치 수)에 0.8을 곱합니다. 예를 들어, 데이터 세트를 80/20으로 분할하고 데이터 세트에 100개의 행이 포함되어 있으면 함수는 0.8*100 = 80을 곱합니다. 80개의 행이 훈련 데이터로 선택됩니다.
우리는 공기질 데이터세트를 사용하여 사용자 정의 함수를 테스트할 것입니다. 공기질 데이터 세트에는 153개의 행이 있습니다. 아래 코드를 통해 확인할 수 있습니다.
nrow(airquality)
출력:
## [1] 153
우리는 다음과 같이 진행합니다:
split_data <- function(df, train = TRUE) Arguments: -df: Define the dataset -train: Specify if the function returns the train set or test set. By default, set to TRUE
함수에는 두 개의 인수가 있습니다. 인수 train은 Boolean 매개변수입니다. TRUE로 설정하면 함수가 train 데이터 세트를 만들고, 그렇지 않으면 test 데이터 세트를 만듭니다.
normalize() 함수에서 했던 것처럼 진행할 수 있습니다. 마치 한 번만 실행되는 코드처럼 작성한 다음, 조건을 포함한 모든 코드를 함수 본문으로 감싸서 함수를 만듭니다.
1 단계 :
데이터 세트의 길이를 계산해야 합니다. 이는 nrow() 함수를 사용하여 수행됩니다. Nrow는 데이터 세트의 총 행 수를 반환합니다. 우리는 가변 길이를 호출합니다.
length<- nrow(airquality) length
출력:
## [1] 153
2 단계 :
길이에 0.8을 곱합니다. 선택할 행 수를 반환합니다. 153*0.8 = 122.4 여야 합니다.
total_row <- length*0.8 total_row
출력:
## [1] 122.4
우리는 공기질 데이터 세트의 122개 행 중 153개 행을 선택하려고 합니다. 1부터 total_row까지의 값을 포함하는 목록을 만듭니다. 결과를 Split이라는 변수에 저장합니다.
split <- 1:total_row split[1:5]
출력:
## [1] 1 2 3 4 5
분할은 데이터 세트에서 처음 122개 행을 선택합니다. 예를 들어, 변수 분할이 1, 2, 3, 4, 5 등의 값을 수집하는 것을 볼 수 있습니다. 이 값은 반환할 행을 선택할 때 인덱스가 됩니다.
3 단계 :
분할 변수에 저장된 값을 기반으로 공기질 데이터세트의 행을 선택해야 합니다. 이는 다음과 같이 수행됩니다.
train_df <- airquality[split, ] head(train_df)
출력:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 51 13 137 10.3 76 6 20 ##[3] 15 18 65 13.2 58 5 15 ##[4] 64 32 236 9.2 81 7 3 ##[5] 27 NA NA 8.0 57 5 27 ##[6] 58 NA 47 10.3 73 6 27 ##[7] 44 23 148 8.0 82 6 13
4 단계 :
나머지 행 123:153을 사용하여 테스트 데이터 세트를 만들 수 있습니다. 이는 분할 앞에 –를 사용하여 수행됩니다.
test_df <- airquality[-split, ] head(test_df)
출력:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 123 85 188 6.3 94 8 31 ##[3] 124 96 167 6.9 91 9 1 ##[4] 125 78 197 5.1 92 9 2 ##[5] 126 73 183 2.8 93 9 3 ##[6] 127 91 189 4.6 93 9 4 ##[7] 128 47 95 7.4 87 9 5
5 단계 :
함수 본문 내부에 조건을 만들 수 있습니다. 기차 세트를 반환하기 위해 기본적으로 TRUE로 설정된 부울 인수 기차가 있다는 것을 기억하십시오. 조건을 생성하려면 if 구문을 사용합니다.
if (train ==TRUE){ train_df <- airquality[split, ] return(train) } else { test_df <- airquality[-split, ] return(test) }
이것이 바로 함수를 작성할 수 있는 것입니다. 우리는 우리의 기능을 어떤 용도로든 시도하고 싶기 때문에 airquality를 df로 변경하면 됩니다. 데이터 프레임, 공기질 뿐만 아니라:
split_data <- function(df, train = TRUE){ length<- nrow(df) total_row <- length *0.8 split <- 1:total_row if (train ==TRUE){ train_df <- df[split, ] return(train_df) } else { test_df <- df[-split, ] return(test_df) } }
대기질 데이터셋에 우리 함수를 적용해 보겠습니다. 학습 데이터셋은 122행, 테스트 데이터셋은 31행으로 구성되어야 합니다.
train <- split_data(airquality, train = TRUE)
dim(train)
출력:
## [1] 122 6
test <- split_data(airquality, train = FALSE)
dim(test)
출력:
## [1] 31 6






