我注意到,在处理sample_frac()slice_sample()时,我得到的样本量不同.我遵循了一个更老的教程,我开始用slice_sample(prop = )替换sample_frac(),我得到了不同数量的行数.

as_tibble(volcano) %>% 
  group_by(V1) %>% 
  sample_frac(0.5)
# output: 44 * 61 sized tbl

as_tibble(volcano) %>% 
  group_by(V1) %>% 
  slice_sample(prop = 0.5)
# output: 39 * 61 sized tbl

虽然我知道在较小的数据集中,这些函数必须四舍五入,但我想知道一个函数是否比另一个函数更准确.特别是当处理许多组时,每个组的大小都不到15行,样本大小非常不同.这很令人不快.

sample_frac()个文档说明:

Sample_n()和Sample_frac()已被取代,取而代之的是Slice_Sample().

如果他们的行为不一致,那就更奇怪了.

推荐答案

BLUF:sample_frac使用round,而slice_sample使用floor.由于volcano具有五个行数为奇数的组,因此这些组在后采样中少了一行,导致了5行的差异.

sample_frac(被取代),从5735f03开始,注意round的用法:

sample_frac.data.frame <- function(tbl, size = 1, replace = FALSE,
                                   weight = NULL, .env = NULL, ...) {
  if (!is_null(.env)) {
    inform("`.env` is deprecated and no longer has any effect")
  }

  size <- enquo(size)
  weight <- enquo(weight)

  dplyr_local_error_call()
  slice(tbl, local({
    size <- round(n() * check_frac(!!size, replace = replace))
    sample.int(n(), size, replace = replace, prob = !!weight)
  }))
}

slice_sample(当前),也是截至5735f03:

slice_sample.data.frame <- function(.data, ..., n, prop, weight_by = NULL, replace = FALSE) {
  size <- get_slice_size(n = n, prop = prop, allow_outsize = replace)

  dplyr_local_error_call()
  slice(.data, local({
    weight_by <- {{ weight_by }}

    n <- dplyr::n()
    if (!is.null(weight_by)) {
      weight_by <- vec_assert(weight_by, size = n, arg = "weight_by")
    }
    sample_int(n, size(n), replace = replace, wt = weight_by)
  }))
}

及其助手函数(相同的文件),请注意这里floor的用法:

get_slice_size <- function(n, prop, allow_outsize = FALSE, error_call = caller_env()) {
  slice_input <- check_slice_n_prop(n, prop, error_call = error_call)

  if (slice_input$type == "n") {
    if (slice_input$n >= 0) {
      function(n) clamp(0, floor(slice_input$n), if (allow_outsize) Inf else n)
    } else {
      function(n) clamp(0, ceiling(n + slice_input$n), n)
    }
  } else if (slice_input$type == "prop") {
    if (slice_input$prop >= 0) {
      function(n) clamp(0, floor(slice_input$prop * n), if (allow_outsize) Inf else n)
    } else {
      function(n) clamp(0, ceiling(n + slice_input$prop * n), n)
    }
  }
}

附注:允许使用负prop会产生不同的结果,不过slice_sample(prop=-0.5)返回48,而不是sample_frac中的44.

R相关问答推荐

使用split.zoo界定xts物体的降水事件

在集合群体模型中计算时间步依赖的速率/参数

在ubuntu 22.04上更新到R4.4后包安装出现编译错误

将一个载体的值相加,直到达到另一个载体的值

基于shiny 应用程序中的日期范围子集xts索引

单击 map 后,将坐标复制到剪贴板

计算R中的威布尔分布的EDF

在位置周围设定一个半径并识别该半径内的其他位置

在R中创建一个包含转换和转换之间的时间的列

如何在kableextra调用cell_spec()中忽略NA?

从一个列表的框架中移除列表包装器

2个Rscript.exe可执行文件有什么区别?

LOF中的插图短文字幕

如何根据数据帧中的值从该数据帧中提取值?

在R中,如何将误差条放置在堆叠的每个条上?

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

在具有多个响应变量的比例堆叠条形图上方添加总计

整理曲线图、曲线图和点图

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

如何在刻面和翻转堆叠条形图中对齐geom_text()