예제를 사용한 R 프로그래밍의 기능

R의 함수란 무엇입니까?

A 기능는 프로그래밍 환경에서 일련의 명령입니다. 프로그래머는 피하기 위해 함수를 만듭니다. 반복하다 같은 일을 하거나 줄이거나 복잡성.

함수는 다음과 같아야 합니다.

  • 특정 작업을 수행하기 위해 작성됨
  • 인수를 포함할 수도 있고 포함하지 않을 수도 있습니다.
  • 시체를 포함
  • 하나 이상의 값을 반환할 수도 있고 반환하지 않을 수도 있습니다.

함수에 대한 일반적인 접근 방식은 인수 부분을 다음과 같이 사용하는 것입니다. 입력, 먹이를 주다 일부를 반환하고 마지막으로 출력. 함수의 구문은 다음과 같습니다.

function (arglist)  {
  #Function body
}

R 중요한 내장 함수

R에는 많은 내장 함수가 있습니다. R은 입력 매개변수를 값이나 위치별로 함수 인수와 일치시킨 다음 함수 본문을 실행합니다. 함수 인수는 기본값을 가질 수 있습니다. 이러한 인수를 지정하지 않으면 R은 기본값을 사용합니다.
주의 사항:
콘솔에서 함수 자체의 이름을 실행하면 함수의 소스 코드를 볼 수 있습니다.

R 중요한 내장 기능

우리는 세 가지 기능 그룹이 작동하는 것을 볼 것입니다

  • 일반 기능
  • 수학 기능
  • 통계 기능

일반 기능

우리는 이미 cbind(), rbind(),range(),sort(),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')

Diff() 함수

길이() 함수

많은 경우에 우리는 길이 계산을 위한 벡터 또는 for 루프에서 사용되는 벡터. length() 함수는 벡터 x의 행 수를 센다. 다음 코드는 자동차 데이터 세트를 가져와 행 수를 반환한다.

주의 사항: 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)

코드 설명

  • 함수 이름은 square_function입니다. 그것은 우리가 원하는 대로 불릴 수 있습니다.
  • 인수 "n"을 받습니다. 우리 사용자가 정수, 벡터 또는 행렬을 전달할 수 있도록 변수 유형을 지정하지 않았습니다.
  • 이 함수는 입력 "n"을 사용하여 입력의 제곱을 반환합니다. 함수 사용이 끝나면 rm() 함수를 사용하여 해당 함수를 제거할 수 있습니다.

# 함수를 만든 후

rm(square_function)
square_function

콘솔에서 함수가 존재하지 않는다는 오류 메시지를 볼 수 있습니다. 오류: 객체 'square_function'을 찾을 수 없습니다.

환경 범위

R에서는 환경 하는 수집 함수, 변수, 데이터 프레임 등과 같은 객체의

R은 Rstudio가 프롬프트될 때마다 환경을 엽니다.

사용 가능한 최상위 환경은 지구 환경, R_GlobalEnv라고 합니다. 그리고 우리는 지역 환경.

현재 환경의 내용을 나열할 수 있습니다.

ls(environment())

산출

## [1] "diff_ts"         "dt"              "speed"           "square_function"
## [5] "ts"              "x"               "x_vector"

R_GlobalEnv에서 생성된 모든 변수와 함수를 볼 수 있습니다.

위 목록은 R Studio에서 실행한 기록 코드에 따라 달라집니다.

square_function 함수의 인수 n은 다음과 같습니다. 이 글로벌 환경이 아닌.

A 기능별로 환경이 생성됩니다. 위의 예에서 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이라는 변수를 만듭니다. 1단계에서는 c2_norm의 코드를 복사하여 붙여넣고 c3 및 cXNUMX으로 변경합니다.

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) 우리는 지명자, 즉 . R에서는 다음과 같은 변수에 지명자를 저장할 수 있습니다.

nominator <- x-min(x)

단계 2) 우리는 계산 분모: . 1단계의 아이디어를 복제하고 계산을 변수에 저장할 수 있습니다.

denominator <- max(x)-min(x)

단계 3) 우리는 지명자와 분모 사이의 나눗셈을 수행합니다.

normalize <- nominator/denominator

단계 4) 호출 함수에 값을 반환하려면 return() 내부에 정규화를 전달하여 함수의 출력을 가져와야 합니다.

return(normalize)

단계 5) 모든 것을 괄호 안에 넣어서 함수를 사용할 준비가 되었습니다.

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)

예제는 간단하지만 공식의 힘을 유추할 수 있습니다. 위의 코드는 읽기 쉽고 특히 코드를 붙여넣을 때 실수를 방지할 수 있습니다.

조건이 있는 함수

때로는 코드가 다른 출력을 반환할 수 있도록 함수에 조건을 포함해야 할 때도 있습니다.

기계 학습 작업에서는 기차 세트와 테스트 세트 간에 데이터 세트를 분할해야 합니다. 열차 세트를 사용하면 알고리즘이 데이터로부터 학습할 수 있습니다. 모델의 성능을 테스트하기 위해 테스트 세트를 사용하여 성능 측정값을 반환할 수 있습니다. 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 데이터 세트를 만듭니다.

Normalise() 함수에서 했던 것처럼 진행할 수 있습니다. 일회성 코드인 것처럼 코드를 작성한 다음 조건이 포함된 모든 항목을 본문에 래핑하여 함수를 만듭니다.

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