【问题标题】:Proportional selection of n rows per group每组 n 行的比例选择
【发布时间】:2021-05-15 18:32:12
【问题描述】:

我有下表关于两个物种的丰度:

df <- tribble(~name, ~id, ~freq, ~toselect,
"spA",  22, 10,  4,
"spA",  23, 10,  4,
"spA",  21, 8,  4,
"spA",  19, 6,  4,
"spA",  25, 5,  4,
"spA",  26, 4,  4,
"spA",  27, 4,  4,
"spA",  28, 3,  4,
"spA",  29, 3,  4,
"spA",  24, 2,  4,
"spA",  30, 2,  4,
"spA",  20, 1,  4,
"spA",  31, 1,  4,
"spA",  33, 1,  4,

"spB",  27, 9,  2,
"spB",  28, 1,  2,
"spB",  29, 1,  2,
"spB",  24, 1,  2,
"spB",  30, 1,  2,
"spB",  20, 1,  2,
"spB",  31, 1,  2,
"spB",  33, 1,  2) 

我想选择 n 行,其中 n 作为物种特定参数包含在小标题中(col“toselect”)。但是,我想根据特定组中物种的频率(col“freq”)选择这些行,即重复是可以的并且想要(例如,在 spB 的情况下,我实际上希望算法选择组 27 两次。 )。

我实际上遇到了两个问题。传统的sample_n(),非常适合选择所需的行数。

df %>% group_by(name) %>% 
    sample_n(toselect[1], replace = T)

我想到的另一个选择是它的继任者slice_sample()。这是一个很酷的功能,适用于重复项。但是,不适用于每个组的不同数量的选定行。

df %>% group_by(name) %>% 
    slice_sample(n = 4, replace = T) # instead of 4 I would like to put there "toselect[1]"

最后,这两个选项都不适用于比例选择。我尝试添加参数weight = freq,但这仍然会产生随机选择。所以我问:有没有办法做到这一点?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    很遗憾,slice_sample() 和 sample_n() 的 n 参数未矢量化。

    因此,您必须使用类似循环的函数来实现这一点。

    这里,我使用dplyr::group_split()purrr::map_dfr()的组合:

    library(tidyverse)
    
    set.seed(0)
    df %>% 
      group_split(name) %>% 
      map_dfr(~{
        sample_n(.x, toselect[1], replace = T)
      })
    #> # A tibble: 6 x 4
    #>   name     id  freq toselect
    #>   <chr> <dbl> <dbl>    <dbl>
    #> 1 spA      33     1        4
    #> 2 spA      29     3        4
    #> 3 spA      19     6        4
    #> 4 spA      27     4        4
    #> 5 spB      27     9        2
    #> 6 spB      28     1        2
    

    reprex package (v2.0.0) 于 2021-05-15 创建

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      相关资源
      最近更新 更多