예를 들어 R 내장 데이터인 iris 데이터셋을 이용해보겠습니다. iris 데이터셋에는 Species 라는 범주형 변수와 꽃받침(Sepal) 의 길이와 너비, 꽃잎(Petal) 의 길이와 너비를 포함하고 있습니다. iris 데이터의 구조를 보기 위해 str(iris) 라고 써주면 다음과 같은 결과가 나옵니다. 5개의 변수에 150개의 관측치과 각 변수 유형이 나와있습니다. Species 변수 유형은 factor 이고 나머지는 숫자형 변수로 구성되어 있네요. 이 때 Species 별로 각 변수의 요약통계량을 계산할 수 있습니다. * 본격적으로 들어가기 전에 파이프라인(%>%) 에 대한 내용을 알아보겠습니다. 파이프라인은 dplyr 패키지 함수와 결합하여 사용하면 굉장히 유용합니다. 파이프라인은 다음과 같이 사용할 수 있습니다. datasets %>% 사용할 함수 %>% 사용할 함수 %>% ... 이 전에 포스팅한 dplyr 함수를 바탕으로 몇 가지 예를 보겠습니다. * iris 데이터에서 Sepal.Length, Sepal.Width 를 선택 iris %>% select(Sepal.Length, Sepal.Width) * iris 데이터에서 Sepal.Length 가 7 이상인 데이터 추출 iris %>% filter(Sepal.Length>=7) * iris 데이터에서 Sepal.Length 가 7 이상이고 Petal.Length 가 6 이상인 데이터 추출 iris %>% filter(Sepal.Length >=7 & Petal.Length>=6) * iris 데이터에서 Sepal.Length 가 7 이상이고 Petal.Length 가 6 이상이고 Petal.Width 가 2 이상인 데이터 추출 iris %>% filter(Sepal.Length >=7 & Petal.Length>=6 & Petal.Width>=2) < Species 별로 Sepal.Length의 요약통계량 계산> iris 데이터에 Species 별로 그룹화하여 Sepal.Length 의 평균을 계산해보겠습니다. iris %>% group_by(Species) %>% summarise(mean(Sepal.Length)) 이제 추가적으로 표준편차, 중앙값, 최대값, 최소값을 구해보겠습니다. iris %>% group_by(Species) %>% summarise(mean(Sepal.Length), sd(Sepal.Length), median(Sepal.Length), max(Sepal.Length), min(Sepal.Length)) summarise 함수에 mean(Sepal.Length), sd(Sepal.Length), median(Sepal.Length), max(Sepal.Length), min(Sepal.Length) 을 넣어주게되면 범주별 요약통계량 값이 나옵니다. 이제 각 변수 명을 따로 지정해주기 위해 다음과 같이 입력합니다. iris %>% group_by(Species) %>% summarise(평균 = mean(Sepal.Length), 표준편차 = sd(Sepal.Length), 중앙값 = median(Sepal.Length), 최대값 = max(Sepal.Length), 최소값 = min(Sepal.Length)) * 요약 정리하면 다음과 같습니다. 이렇게 파이프라인과 각 함수를 함께 이용하면 코드를 구성할 때 큰 도움이 됩니다. 파이프연산자를 쓰지 않으면 코드 구성을 알아보기 힘들겠지만 위 그림과 같이 직관적으로 이해할 수 있습니다. group_by의 역할은 범주형 변수의 그룹화를 통해 summarise 함수로 요약통계량을 계산할 수 있습니다. 궁금한 점은 댓글로 남겨주세요! 속도면에서는 결과를 출력한 뒤에 sales %>% group_by(district) %>% summarise(sum.sales.num = sum(sales.num))8를 빼는 것보다 먼저 sales %>% group_by(district) %>% summarise(sum.sales.num = sum(sales.num))8를 미리 빼놓고 다음에 계산하는 것이 훨씬 좋다. 사실, 데이터가 크지 않으면 큰 차이가 없다. sales %>% group_by(district)1 sales %>% group_by(district)0 group by (성별)city district gender sales.nm sales.cd ymd sales.num 1 서울특별시 강남구 남 스탑버스 12AA02 20140101 103 2 서울특별시 강남구 여 키즈랜드 100101 20140101 309 3 서울특별시 강남구 여 키즈랜드 100101 20140101 365 4 서울특별시 강남구 남 스탑버스 12AA02 20140101 4217를 이용해 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373282 (성별)로 그룹핑을 한다. 결과로 성별별 판매건수 평균가 나온다. sales %>% group_by(district)3 sales %>% group_by(district)4 NAdistrict sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373283의 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284는 R에서 특별하게 missing을 다루는 특정 값이다. district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284가 들어가 있는 데이터를 필터링하기 위해 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373286 하면 잘 되지 않는데, 이유는 R에서 NA를 특별대우를 해주기 때문이다. is.nadistrict sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284의 경우에만 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373283라는 함수가 별도로 존재한다. district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373283를 이용해 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284 값만 골라낸다. district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284가 아닌 것만 고르려면 앞에 sales %>% group_by(district) %>% summarise(mean.sales.num = mean(sales.num))2를 붙여주면 된다. sales %>% group_by(district) %>% summarise(mean.sales.num = mean(sales.num))3을 이용해 성별이 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284인 것은 제외한다. sales %>% group_by(district)5 sales %>% group_by(district)6 기후 데이터로 실습기후 데이터를 불러온다. sales %>% group_by(district)7 변수 이름 바꾸기변수이름을 영어로 바꾼다. sales %>% group_by(district)8 group by(구)city district gender sales.nm sales.cd ymd sales.num 1 서울특별시 강남구 남 스탑버스 12AA02 20140101 103 2 서울특별시 강남구 여 키즈랜드 100101 20140101 309 3 서울특별시 강남구 여 키즈랜드 100101 20140101 365 4 서울특별시 강남구 남 스탑버스 12AA02 20140101 4217를 이용해 city district gender sales.nm sales.cd ymd sales.num 1 서울특별시 강남구 남 스탑버스 12AA02 20140101 103 2 서울특별시 강남구 여 키즈랜드 100101 20140101 309 3 서울특별시 강남구 여 키즈랜드 100101 20140101 365 4 서울특별시 강남구 남 스탑버스 12AA02 20140101 4218 (구)별로 강수량의 합을 구한다. sales %>% group_by(district)9 city district gender sales.nm sales.cd ymd sales.num 1 서울특별시 강남구 남 스탑버스 12AA02 20140101 103 2 서울특별시 강남구 여 키즈랜드 100101 20140101 309 3 서울특별시 강남구 여 키즈랜드 100101 20140101 365 4 서울특별시 강남구 남 스탑버스 12AA02 20140101 4210 NA 관련 옵션na.rmR에서 sales %>% group_by(district) %>% summarise(sum.sales.num = sum(sales.num))1이나 sales %>% group_by(district) %>% summarise(sum.sales.num = sum(sales.num))4을 할 때 miising 값 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284가 들어가 있으면 결과로 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284가 출력한다. district mean.sales.num 1 강남구 250.7121 2 강동구 248.9412 3 강북구 250.7344 4 강서구 249.91261로 하여 district sum.sales.num 1 강남구 2632978 2 강동구 2623093 3 강북구 2635469 4 강서구 26373284 값을 제거한다. |