【问题标题】:Randomly sleeting rows based on all groups in two columns根据两列中的所有组随机屏蔽行
【发布时间】:2021-07-23 07:40:59
【问题描述】:

我有一个包含大约 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"

因此,我需要确保采样数据包含来自这两个组列的所有组合的行。 希望有人能帮忙。

谢谢!

【问题讨论】:

  • 如果id&quality的组合数大于2000会怎样?
  • 您能否选择一个答案,以便我们结束这个问题?

标签: r random dplyr sample


【解决方案1】:

我想这就是你要找的。​​p>

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。

【讨论】:

  • 我不能采用这种方法,因为我在每一列中有这么多组,最后需要一个汇总的样本数据。
  • 每列中有很多组是什么意思?您能否提供一个数据示例以及预期结果?因为我现在根据您的描述相信我的解决方案有效。
  • 你刚才说你不能采取这种方法,但另一个答案有相同的方法,我只是添加了一个独特的列,除了思维过程是相同的......但只要你可以为你的问题找到帮助,我不介意
  • 我们的方法是一样的,但 syntax 不同:-) 支持你的答案。
【解决方案2】:

如果您想确保每个 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_nslice_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
        )

【讨论】:

  • 谢谢!,我总共需要 2000 行,而且您的方法是从列的每个组合中选择两个随机行。我什至可能在两组的每个组合中都没有两行
  • 好的,如果你需要2000行,你需要统计uniqueids的数量,并相应地设置样本大小。如果您没有“足够”,您可以更换样品。无论如何,我认为这是你的目标?
  • 我不必从两列中的每个组组合中选择相等的数字。所以,不需要更换。 id 有 12 个独特的关卡,但我不知道它有什么帮助。
  • 还有多少个独特的quality?运行 df %&gt;% group_by(id, quality) %&gt;% summarise(obs = n()) 比计算 20.000 样本需要多少更明智!
  • 对不起,是 2000 年。
猜你喜欢
  • 2021-08-19
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多