[R 데이터 탐색] 2. map 함수를 활용한 변수별 기술통계량 한번에 확인하기

수진·2020년 2월 12일
1

R

목록 보기
3/12
post-thumbnail

이전 포스팅에서 데이터요약 확인 방법과 기술통계량 함수에 대해 정리해두었는데요, purrr 패키지의 map함수를 활용하여 데이터 내 모든 수량적 변수에 대해 기술통계량 한번에 보기를 해볼거에요.

  뒤 길~게 적어나갈 방법으로 하지 않고 아래와 같이 짧게 설정해도 되는데요, map함수 공부를 위해 돌아간다고 생각하고 작성하였습니다.

psych::describe(carseats, omit = TRUE) %>%  # omit = TRUE : 수치적 변수가 아닌 경우 생략
  dplyr::mutate(vars = colnames(purrr::keep(carseats, is.numeric)))

🧐기초 설명

  purrr과 dplyr 패키지모두 데이터 전처리에 유용함 함수들이 내재되어 있습니다. RStudio 웹싸이트의 패키지 Cheatsheets를 참고하시면 좋겠습니다.

  • purrr::keep(.x = A list or vector, .p = 함수)
    • purrr 패키지 내재 함수
    • .p에 입력된 함수에 충족하는 데이터만을 유지
    • .p에 is.numeric을 넣어줄 경우, 숫자형 데이터만 남는다
  • purrr::map(.x = A list or vector, .p = 함수)
    • purrr 패키지 내재 함수
    • .p에 입력된 함수를 x.에 입력된 리스트 혹은 원소에 반복하여 적용해준다 (for문보다 짧게, 빠르게 처리 가능하다!)
    • map은 리스트 형태로 반환해주고 map_df는 데이터 프레임 형태로 반환해준다
  • dplyr::mutate(.data = 데이터명, 변수 명 = 변수에 들어갈 내용)
    • dplyr 패키지 내재 함수
    • 새로운 변수를 만들어 주거나 기존 변수를 새로운 기준으로 덮어씌울 수 있다

🧐 (참고) map 함수별 반환값

함수 형태반환값
map리스트
map_chr 문자 벡터
map_dbl더블 (숫자형) 벡터
map_df데이터프레임
map_int정수형 벡터
map_lgl논리형 벡터

🧐 코드 작성

  • 기본 코드
    아래와 같이 map 함수를 이용하면 데이터 내 각 변수별로 기술통계량을 한번에 정리할 수 있습니다.
diamonds %>% 
  purrr::keep(.p = is.numeric) %>% # 숫자형 데이터만 남기기
  purrr::map_df(.x = .,
                .f = psych::describe) %>%  # 앞의 데이터에 대해 기술통계량을 구해주는 함수 적용
  dplyr::mutate(vars = colnames(purrr::keep(.x = diamonds,
                                            .p = is.numeric))) # 기술 통계량이 어떠한 변수에 대한 것인지 추가 

    - mutate를 추가한 이유 ?
    mutate로 vars 변수에 diamonds 내 수치형 데이터의 colnames를 넣어주었는데요, 넣지 않을 경우 아래와 같이 vars 변수는 1로만 적혀진답니다.

  • 사용자 함수로 만들기
    function(x)을 활용하여 사용자 함수로 만들어 버리면 이후 긴 코드를 모두 작성할 필요가 없습니다.
dataSummary <- function(x){ # dataSummary라는 이름으로 사용자 함수 생성
  x %>% 
    purrr::keep(.p = is.numeric) %>%
    purrr::map_df(.x = .,
                  .f = psych::describe) %>% 
    dplyr::mutate(vars = colnames(purrr::keep(.x = x,
                                              .p = is.numeric)))
}
dataSummary(women) # R에 내장되어있는 다른 데이터로 출력해보기

  이상으로 사용자함수 생성과 map 함수 사용을 연습해보았습니다. :-)

profile
안녕하세요! 이것저것 하고 있습니다 👩‍🔧

1개의 댓글

comment-user-thumbnail
2022년 3월 21일

안녕하세요, 이 페이지에 있는 함수 만들기 과정이 도움이 되었습니다. 그런데 이틀 동안 도전해본 결과로는 이 페이지에 제시된 함수로는 결과가 나오지 않네요.

dataSummary <- function(x){ # dataSummary라는 이름으로 사용자 함수 생성
x %>%
purrr::keep(.p = is.numeric) %>%
purrr::map_df(.x = .,
.f = psych::describe) %>%
dplyr::mutate(vars = colnames(purrr::keep(.x = x,
.p = is.numeric)))
}
dataSummary(women)

를 이용하면, 항상 다음과 같은 에러에 맞닥뜨립니다.

Error in Math.data.frame(list(vars = c("carat", "depth", "table", "price", :
non-numeric-alike variable(s) in data frame: vars

2년이나 지난 글이라서 댓글에 대한 반응이 있을지는 모르겠네요. 수고하십쇼!

답글 달기