1. 명령형 프로그래밍
- for 루프 : 출력 + 시퀀스 + 본문
- 출력 : vector(type, length)로 길이가 주어진 긴 벡터 생성
- 시퀀스 : 자료가 데이터 프레임인 경우 1:legnth(data)보다 seq_along(data)가 안전
- while 루프
- for문과 다르게 시퀀스의 길이가 명확하지 않을 때 유용하다.
- 출력 길이를 모르는 경우 : 결과를 리스트에 저장후 unlist 혹은 purrr::flatten_* 함수를 사용
- 긴 문자열이 출력되는 경우 : 문자형 벡터에 저장후 paste 혹은 str_c 함수를 사용해 단일 문자열로 결합
- 큰 데이터 프레임을 생성하는 경우 : 결과를 리스트에 저장후 bind_rows 및 bind_cols 함수를 사용
2. 함수형 프로그래밍
map(data, fun, ...) | 리스트를 출력 |
map_lgl(data, fun, ...) | 논리형 벡터를 출력 |
map_int(data, fun, ...) | 정수형 벡터를 출력 |
map_dbl(data, fun, ...) | 더블형 벡터를 출력 |
map_chr(data, fun, ...) | 문자형 벡터를 출력 |
map2(.x, .y, .f) | x, y 변수의 원소별(순서대로)로 함수 fun(x, y, …)을 적용한 값을 리스트로 반환 |
pmap(.l, .f) | 리스트를 받아 각 변수의 첫번째~마지막번째 원소를 fun에 적용시킨 값을 리스트로 반환 |
invoke_map(.f, .x=list(NULL)) | 함수리스트(Function List) f에 변수 x의 값을 각각 넣은 값들을 리스트로 반환 (현재 deprecated function으로 map2 + exec 구문으로 대체) |
pmap(.l=list(n=c(3,5,10), mean=c(-5,0,5), sd=c(1,3,5)), .f=rnorm)
Map(f=rnorm, n=c(3,5,10), mean=c(-5,0,5), sd=c(1,3,5))
이번에는 deprecated function인 invoke_map과 이를 대체할 수 있는 map2 + exec 구문입니다.
param <- list(
list(min=-1, max=1),
list(sd=5),
list(lambda=10))
f <- c("runif", "rnorm", "rpois")
invoke_map(f, param, n=5)
map2(.x=f, .y=param, .f=function(x,y){exec(x, n=5, !!!y)})
3. 실패 처리 : 몇 개의 오류로 성공한 모든 결과에 접근할 수 없는 상황을 방지
- safely(fun) 함수를 사용해 오류가 발생해도 다른 성공결과에 접근할 수 있음
- 단 safely(fun)함수는 함수공장(function factory)로 출력이 함수형태
- result : 원래 fun을 적용했을 때 결과로 오류가 있다면 NULL이 반환
- error : fun을 적용했을 때 오류가 있다면 이를 반환
- possibly(.f, otherwise) 함수는 safely의 단순한 버전으로 오류가 뜨는 값의 반환을 otherwise로 지정
safe_log <- safely(log)
list("a",10,100) %>%
map(safe_log) %>%
transpose()
'Data Science > Manipulation' 카테고리의 다른 글
[R] all_of와 any_of를 사용한 변수 선택 (조건을 이용한 선택 추가) (1) | 2023.07.29 |
---|---|
[Data Science With R] 15. Modelr을 활용한 모델 생성 (0) | 2023.05.17 |
[Data Science With R] 13. 함수형(Functional) with Base and purrr (0) | 2023.04.16 |
[Data Science With R] 12. 함수(Function) (0) | 2023.04.16 |
[Data Science With R] 11. Time Data with lubridate (202406) (0) | 2023.04.08 |