簡體   English   中英

基於兩列中的所有組隨機排列行

[英]Randomly sleeting rows based on all groups in two columns

我有一個大約有 167k 行的大型數據集。 我想抽取 2000 行的樣本,同時確保我從數據中的兩列(id & quality)中的所有組中抽取行。 這是數據的快照

df <- data.frame(id=c(1,2,3,4,5,1,2),
                 quality=c("a","b","c","d","z","g","t"))

df %>% glimpse()
Rows: 7
Columns: 2
$ id      <dbl> 1, 2, 3, 4, 5, 1, 2
$ quality <chr> "a", "b", "c", "d", "z", "g", "t"

因此,我需要確保采樣數據具有來自這兩個組列的所有組合的行。 我希望有人能幫忙。

謝謝!

我想這就是你要找的。

my_df <- data.frame(id = c(1, 2, 3, 4, 5, 1, 2, 2, 2),
                    quality = c("a", "b", "c", "d", "z", "g", "t", "t", "t"))

my_df <- my_df %>% group_by(id, quality) %>% mutate(Unique = cur_group_id())
my_df$Test <- seq.int(from = 1, to = nrow(my_df), by = 1)

my_a <- my_df %>% group_by(Unique) %>% sample_n(., 1)
my_b <- my_df %>% group_by(Unique) %>% sample_n(., 1)
my_c <- my_df %>% group_by(Unique) %>% sample_n(., 1)
my_d <- my_df %>% group_by(Unique) %>% sample_n(., 1)
my_e <- my_df %>% group_by(Unique) %>% sample_n(., 1)

您不需要那么多數據框,這些只是示例,表明對於每個唯一的組,將隨機提取 1 行。 根據數據樣本,在名為“Test”的列中可以看到差異,特別是對於 id = 2 和 quality = t。

如果要確保每個idquality都在新樣本中表示,則需要按這些變量對數據進行group

您正在尋找的是以下內容,

df %>% 
        group_by(id,quality) %>% 
        sample_n(1, replace = TRUE)

您可以更改樣本大小 pr groupid ,並根據需要設置replacement

它給出了以下輸出,

# Groups:   id, quality [7]
     id quality
  <dbl> <chr>  
1     1 a      
2     1 g      
3     2 b      
4     2 t      
5     3 c      
6     4 d      
7     5 z 

您提供的數據具有唯一的組,因此按照您希望的方式進行采樣,提供的行數與您的數據相同。


編輯: sample_n被 slice_sample slice_sample ,我不知道這一點。 但是您可以通過以下方式輕松更改script

df %>% 
        group_by(id,quality) %>% 
        slice_sample(
                n = 1
        )

您還可以通過設置prop而不是n來對data.frameproportion進行采樣,

df %>% 
        group_by(id,quality) %>% 
        slice_sample(
                prop = 0.25
        )

暫無
暫無

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

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