[Data Science With R] 13. 함수형(Functional) with Base and purrr

2023. 4. 16. 17:09·Data Science/Manipulation

함수형은 개념이 조금 낯설게 다가올 수 있습니다.

for문을 배운상태에서 함수형 강의를 들으면서 이게 뭐지 싶었던 기억이 있네요.

이번 포스팅에서는 함수형을 자세하게 다루지않고 요약 및 base 패키지와 purrr 패키지의 비교로 마무리하므로 자세한 설명이 필요하신 분은 다른 서적이나 블로그에서 참고하시고 요약 필요할때 참고하시면 좋겠습니다!

 

함수형과 함께 함수리스트, 함수공장에 대한 개념에 대해 간단하게 살펴보면 다음과 같습니다.

 

1. 함수형(Functional) : 함수를 파라미터로 사용하는 함수

2. 함수리스트(Function List) : 리스트의 원소가 함수들로 이루어진 객체

3. 함수공장(Function Factory) : 새로운 함수를 출력하는 함수

 

함수를 파라미터로 사용하는 함수인 함수형의 예시는 아래와 같습니다.

plot_frame이라는 함수는 입력받은 함수에 데이터를 입력해 출력하는 함수입니다.

plot_frame <- function(data, FUN, ...){
  FUN(data, ...)
}

data = matrix(rnorm(1000), ncol=2)
plot_frame(data, FUN=plot)
plot_frame(data, FUN=hist)
plot_frame(data, FUN=boxplot)

1. apply 계열의 함수형 함수

apply(data, MARGIN, FUN) 배열 또는 행렬의 각 마진에 함수 적용한 값을 백터나 행렬 또는 리스트로 반환
lapply(data, FUN, …)
>> purrr::map
리스트의 각 원소에 함수를 적용한 결과를 리스트로 반환
sapply(data, FUN, …, simplify=T, USE.NAMES)
>> purrr::map_*
리스트의 각 원소에 함수를 적용한 결과를 백터로 반환
(simplify=F인 경우 리스트 반환, "array"인 경우 배열로 반환)
vapply(data, FUN, FUN.VALUE, …, USE.NAMES)
>> purrr::map_*
sapply와 유사하지만 반환값의 유형을 FUN.VALUE에 미리 지정해
함수를 적용한 값을 반환 (sapply보다 안전한 wrapper)
mapply(FUN, …, SIMPLIFY=T)
>> purrr::map, map2, pmap
두 개이상의 리스트를 받아 각 원소별 함수를 적용한 값을 출력 (Map 함수와 유사)
replicate(n, expr, simplify = "array") expr을 n번 반복해 각 결과를 행렬로 반환 (simplify=F인 경우 리스트 반환)

 

2. 함수형 프로그래밍에서 고차원 함수

Reduce(f, x, init, right=F, accumulate=F)
>> purrr::reduce
벡터나 리스트를 입력받아 첫번째 원소부터 마지막 원소까지 순차적으로 함수를 적용한
결과로 상수값 반환
(ex. Reduce(f, 1:4) = f( f( f(1, 2), 3), 4) )
Filter(f, x)
>> purrr::keep, purrr::discard
리스트의 각 원소에 (논리)함수를 적용해 참인 원소만 반환
Find(f, x, right=F, nomatch=NULL)
>> purrr::detect
리스트의 각 원소를 (왼쪽에서 오른쪽 순서로) 함수에 적용시켜 참인 경우
처음으로 참이 나온 리스트의 원소를 반환
Position(f, x, right=F, nomatch=NA)
>> purrr::detect_index
리스트의 각 원소를 (왼쪽에서 오른쪽 순서로) 함수에 적용시켜 참인 경우
처음으로 참이 나온 리스트의 원소의 위치를 출력
Map(f, …)
>> purrr::map, map2, pmap, exec
...에 입력항목 두개 이상을 입력할때 유용하며
각 리스트의 같은 순서의 원소에 함수를 적용한 값을 리스트로 반환
Negate(f) 논리 함수 f의 결과를 부정하여 출력

 

  • Reduce 함수는 주어진 벡터 및 리스트의 요소와 가능한 초기값을 연속적으로 결합하기 위해 binary 함수를 사용한다.
  • Filter 함수는 논리(Logical) 함수가 참인 벡터의 요소를 반환한다. (즉 참/거짓을 반환하는 함수)
  • Find와 Position 함수는 논리 함수가 참인 벡터 및 리스트의 처음 위치혹은 원소를 반환 (참/거짓을 반환하는 함수)
  • Map은 주어진 벡터의 각 요소를 순차적으로 함수에 적용
  • Negate는 지정된 함수의 부정을 생성

1) Reduce(reduce) 함수 예제

Reduce(f=max, list(3,2,4,12), init=1) # 12
Reduce(f="/", c(pi, sqrt(2)), init=1) # 1/3.14/sqrt(2)

dfs <- list(
  age = tibble(name="John", age=30),
  sex = tibble(name=c("John", "Mary"), sex=c("M", "F")),
  trt = tibble(name="Mary", treatment = "A"))

Reduce(f=full_join, x = dfs)
reduce(dfs, full_join)

 

2) Filter(keep), Find(detect), Position(detect_index) 예제 

test <- list("1"=data.frame(iris[1:10,]), "2"=1:10, "3"=tibble(a=1:4))
Filter(f=is.data.frame, x = test) # "1"과 "3"에 해당되는 데이터프레임 출력
keep(test, is.data.frame)         # "1"과 "3"에 해당되는 데이터프레임 출력

test2 <- list("a"=data.frame(iris),"b"=1:5,"c"=letters[1:5])
Find(is.vector, test2)     # 처음으로 벡터인 "b"원소 해당되는 1 2 3 4 5 
detect(test2, is.vector)   # 처음으로 벡터인 "b"원소 해당되는 1 2 3 4 5 

Position(is.vector, test2)     # 처음으로 벡터인 원소의 인덱스 2
detect_index(test2, is.vector) # 처음으로 벡터인 원소의 인덱스 2

 

3) Map(pmap) 예제

Map(f=rnorm, n=c(10,20,30), mean=c(-5,0,5), sd=c(1,20,300))
param <- list(n=c(10,20,30), mean=c(-5,0,5), sd=c(1,20,300))
pmap(.l=param, .f=rnorm)

 

3. 그룹별 데이터에 유용한 함수형 함수

  • aggregate 함수 : 데이터를 subset으로 분리하여 각 그룹, 각 열의 통계량을 계산하여 반환
aggregate(iris[,1:4], list(Species=iris$Species), mean)

  • tapply 함수
tapply(iris$Sepal.Length, iris$Species, mean)

저작자표시 비영리 변경금지 (새창열림)

'Data Science > Manipulation' 카테고리의 다른 글

[Data Science With R] 15. Modelr을 활용한 모델 생성  (0) 2023.05.17
[Data Science With R] 14. 반복수행 with purrr  (0) 2023.04.18
[Data Science With R] 12. 함수(Function)  (0) 2023.04.16
[Data Science With R] 11. Time Data with lubridate (202406)  (0) 2023.04.08
[Data Science With R] 10. 범주형 데이터 조작 with forcats (202406)  (0) 2023.04.08
'Data Science/Manipulation' 카테고리의 다른 글
  • [Data Science With R] 15. Modelr을 활용한 모델 생성
  • [Data Science With R] 14. 반복수행 with purrr
  • [Data Science With R] 12. 함수(Function)
  • [Data Science With R] 11. Time Data with lubridate (202406)
임파카
임파카
[ML & Statistics] 모바일 버전에서 수식 오류가 있어 PC 환경에서 접속하는 것을 권장합니다.
  • 임파카
    무기의 스탯(Stat)
    임파카
  • 전체
    오늘
    어제
    • Study (149)
      • Data Science (44)
        • Modeling (18)
        • Manipulation (21)
        • Visualization (4)
      • Statistics (59)
        • Mathmetical Statistics (53)
        • Categorical DA (1)
      • Web Programming (17)
      • AI (26)
        • Machine Learning (16)
        • Deep Learning (10)
      • 활동 및 프로젝트 (3)
  • 인기 글

  • hELLO· Designed By정상우.v4.10.5
임파카
[Data Science With R] 13. 함수형(Functional) with Base and purrr
상단으로

티스토리툴바