簡體   English   中英

如何使用`sample_n`自動平衡`dplyr`中的數據集到最小類的大小?

[英]How to balance a dataset in `dplyr` using `sample_n` automatically to the size of the smallest class?

我有一個數據集,如:

df <- tibble(
  id = 1:18,
  class = rep(c(rep(1,3),rep(2,2),3),3),
  var_a = rep(c("a","b"),9)
)

# A tibble: 18 x 3
      id cluster var_a
   <int>   <dbl> <chr>
 1     1       1 a    
 2     2       1 b    
 3     3       1 a    
 4     4       2 b    
 5     5       2 a    
 6     6       3 b    
 7     7       1 a    
 8     8       1 b    
 9     9       1 a    
10    10       2 b    
11    11       2 a    
12    12       3 b    
13    13       1 a    
14    14       1 b    
15    15       1 a    
16    16       2 b    
17    17       2 a    
18    18       3 b 

該數據集包含多個類別中的許多觀察結果。 班級不平衡。 在上面的示例中,我們可以看到,只有 3 個觀測值屬於第 3 類,而第 2 類有 6 個觀測值,第 1 類觀測值有 9 個。

現在我想自動平衡該數據集,以便所有類的大小相同。 所以我想要一個 9 行的數據集,每個班級 3 行。 我可以使用dplyrsample_n函數來進行這樣的采樣。

我通過首先計算最小的班級人數來做到這一點。

min_length <- as.numeric(df %>% 
  group_by(class) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  summarise(min = min(n)))

..然后應用sample_n函數:

set.seed(1)
df %>% group_by(cluster) %>% sample_n(min_length)

# A tibble: 9 x 3
# Groups:   cluster [3]
     id cluster var_a
  <int>   <dbl> <chr>
1    15       1 a    
2     7       1 a    
3    13       1 a    
4     4       2 b    
5     5       2 a    
6    17       2 a    
7    18       3 b    
8     6       3 b    
9    12       3 b    

我想知道是否有可能一次性做到(計算最小的班級人數然后抽樣)?

你可以一步完成,但它有點作弊:

set.seed(42)
df %>%
  group_by(class) %>%
  sample_n(min(table(df$class))) %>%
  ungroup()
# # A tibble: 9 x 3
#      id class var_a
#   <int> <dbl> <chr>
# 1     1     1 a    
# 2     8     1 b    
# 3    15     1 a    
# 4     4     2 b    
# 5     5     2 a    
# 6    11     2 a    
# 7    12     3 b    
# 8    18     3 b    
# 9     6     3 b    

我說“作弊”是因為通常你不想從管道中引用df$ 但是,因為我們要查找的它們的屬性是整個框架的,而table函數一次只能看到一組,所以我們需要稍微回避一下。

一個可以做

df %>%
  mutate(mn = min(table(class))) %>%
  group_by(class) %>%
  sample_n(mn[1]) %>%
  ungroup()
# # A tibble: 9 x 4
#      id class var_a    mn
#   <int> <dbl> <chr> <int>
# 1    14     1 b         3
# 2    13     1 a         3
# 3     7     1 a         3
# 4     4     2 b         3
# 5    16     2 b         3
# 6     5     2 a         3
# 7    12     3 b         3
# 8    18     3 b         3
# 9     6     3 b         3

雖然我不認為那更優雅/可讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM