1. 程式人生 > >使用R語言中的tidyverse進行分組處理

使用R語言中的tidyverse進行分組處理

  • 使用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