【R】 dplyr::group_nest를 사용하여 집계
9420 단어 R
소개
지금까지 R은 조금 어려울 것 같다고 느끼고 있어, 복잡한 통계 계산 이외에는 사용하고 있지 않았습니다만, tidyverse가 의외로 간단할 것 같은 생각이 들었으므로, 최근 또 사용하기 시작했습니다. 그 중에서도 tidyverse의 dplyr 패키지에 있는 group_nest가 편리할 것입니다만, 사용법을 잘 몰랐습니다.
데이터로서 국토교통성이 공개하고 있다
지금까지 공표한 면적조(쇼와 63년 이후) 에 있는 「영화 원년 7월 이후(영화 2년 7월까지)[CSV:154KB]」를 읽어 집계해 보았습니다.
library(tidyverse)
library(magrittr)
area_data <- read_csv("R1_R2_all_mencho.csv", skip=4, locale=locale(encoding="CP932"))
이 파일의 인코딩은 CP932이며 헤더의 문자에 ㎡가 사용됩니다.
소개
read.csv("R1_R2_all_mencho.csv", skip=4, fileEncoding="CP932")
로 읽어 보았습니다만, ㎡가 잘 취급할 수 없었습니다.시구정촌 이외의 데이터도 포함되어 있었으므로, 시구정촌만의 데이터로 합니다.
area_data %<>% select(1,2,4,5) %>% rename(`面積`=starts_with("令和"))
area_data %<>% filter(!is.na(`市区町村`) & !str_detect(`市区町村`, "\\(") & !is.na(`標準地域コード`))
area_data %<>% select(-`標準地域コード`)
area_data에는 이러한 데이터가 들어 있습니다.
도도부현별로 집계한다
g1 <- area_data %>% group_nest(`都道府県`)
도도부현별로 그룹화하고 있습니다. 설명이 나중에 되어 버렸습니다만, 여기에서는 RStudio를 사용하고 있습니다. g1의 표시입니다. 각 도도부현이 1행으로 되어 있습니다.
data 열의 표 아이콘을 클릭하면 그 도도부현의 데이터가 표시됩니다.
data 열의 전체 데이터는
g1$data
로 표시됩니다. 도도부현별로 분할된 tibble의 리스트입니다. group_split과 비슷한 형식이지만 group_nest에서는 도도부현이 빠져 있습니다.이번은, 시정촌 합병으로 감소했습니다만 「마을」에 대해서 집계해 봅니다.
먼저 tibble(또는 data.frame) 데이터에서 마을만 꺼내는 함수를 만들어 보겠습니다.
mura <- function(x){filter(x, str_ends(`市区町村`, "村"))}
「시구정촌」으로 마을로 끝나는 것만을 꺼냅니다. 그룹화 전에 area_data 데이터를 사용해보십시오.
mura(area_data)
마을만이 추출되었음을 알 수 있습니다.다음으로 group_nest 된 데이터에 적용해 보겠습니다. 위의
g1$data
출력을 처리 할 수 있으면 좋습니다.purrr에 있는 map을 사용합니다.
map(g1$data, ~mura(.))
그러면 마을에만 좁혀진 목록이 반환됩니다.g1 %<>% mutate(`村`=map(data, ~mura(.x)))
g11 <- g1 %>% unnest(`村`) # おまけ
이제 마을 열에 마을에만 좁혀진 데이터가 추가되고 g11에는 전개된 데이터가 들어갑니다. 일부러 함수를 만들지 않아도 익명 함수로
g1 %<>% mutate(`村`=map(data, function(x){filter(x, str_ends(`市区町村`, "村"))}))
g1 %<>% mutate(`村`=map(data, ~filter(.x, str_ends(`市区町村`, "村"))))
처럼 쓸 수도 있습니다.
다음으로, 마을의 수와 면적 합계를 집계해 보겠습니다.
g1 %<>% mutate(`村数`=map_int(`村`, nrow))
g1 %<>% mutate(`村面積合計`=map_dbl(`村`, ~sum(.x$`面積`)))
map 안의 함수를 어떻게 써도 좋은지 잘 모르게 되어 버립니다. 그 때는 위에 쓴 것처럼 별도로 함수를 만들어 확인하고 있습니다.
여기에서는 map이 아니라 map_int나 map_dbl로 하고 있습니다. map이라고 하면 리스트를 돌려주고, 그대로는 수치로서의 처리를 할 수 없게 되어 버립니다. (unnest를 사용하면 할 수 있습니다만) 수치 벡터로 해 둘 필요가 있습니다.
goup_nest라고 표 안에 모든 데이터가 남아 있고, RStudio를 사용하면 데이터 구조를 알기 쉽게 표시할 수 있으므로 편리합니다.
Reference
이 문제에 관하여(【R】 dplyr::group_nest를 사용하여 집계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ki073/items/0ba83b5546f99739e623텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)