使用R語言中的tidyverse進行分組處理
阿新 • • 發佈:2019-01-05
- 使用tidyverse包可以方便地進行分組處理。
> data
name id grade
1 a 1 60
2 a 2 NA
3 b 3 60
4 c 4 80
5 c 5 60
6 c 6 60
可以對不同class進行分組,並作相應地統計。
library(tidyverse)
- 對name分組後計數
> data %>% group_by(name) %>% summarise(count = n()) # A tibble: 3 x 2 name count <fct> <int> 1 a 2 2 b 1 3 c 3
- 對grade去重後計數
> data %>% group_by(name) %>% summarise(n_distinct(grade))
# A tibble: 3 x 2
name `n_distinct(grade)`
<fct> <int>
1 a 2
2 b 1
3 c 2
- 統計grade欄位中非NA的數量。邏輯結果中,TRUE的值為1,FALSE的值為0。
> data %>% group_by(name) %>% summarise(count = sum(!is.na(grade))) # A tibble: 3 x 2 name count <fct> <int> 1 a 1 2 b 1 3 c 3
- 求grade的平均值, 不考慮NA。
> data %>% group_by(name) %>% summarise(mean = mean(grade, na.rm = T))
# A tibble: 3 x 2
name mean
<fct> <dbl>
1 a 60
2 b 60
3 c 66.7
- 求grade的平均值,但只考慮id為奇數的記錄。這裡是可以在分組內指定條件的,像sql中的having, 中括號中的語句就是限定的條件,中括號前的內容是要統計的欄位。
> data %>% group_by(name) %>% summarise(mean = mean(grade[id%%2 == 1], na.rm = T)) # A tibble: 3 x 2 name mean <fct> <dbl> 1 a 60 2 b 60 3 c 60
- 統計每個分組下,grade欄位中值為60的的記錄所佔的比例,可以巧妙地使用平均函式與邏輯判斷。
> data %>% group_by(name) %>% summarise(ratio = mean(grade == 60, na.rm = T))
# A tibble: 3 x 2
name ratio
<fct> <dbl>
1 a 1
2 b 1
3 c 0.667