You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dplyr管道中对tibble按列随机下采样且不改变数据类型

用dplyr管道实现按列随机下采样(保持tibble类型)

嘿,这事儿用dplyr的链式管道完全能搞定,而且全程不会改变tibble的数据类型,我给你一步步说明:

首先,先定义你的原始tibble:

library(dplyr)

original_tbl <- tibble(a = c(1,2,3,4,5), b = c(1,1,1,2,2))

接下来就是核心的下采样代码,全程用管道串联:

downsampled_tbl <- original_tbl %>%
  # 按b列分组,让每个组单独处理下采样
  group_by(b) %>%
  # 对每个组随机无放回抽样:组内行数≥2就取2行,少于2行就全留
  slice_sample(n = min(n(), 2), replace = FALSE) %>%
  # 取消分组,确保结果是普通tibble而非分组tibble
  ungroup() %>%
  # 可选:按b和a排序,让结果结构和你给出的示例一致(抽样随机,排序后更贴合预期)
  arrange(b, a)

代码细节解释:

  • group_by(b):把数据按b列的取值拆分成分组,这样我们能针对每个类别单独执行下采样逻辑。
  • slice_sample(n = min(n(), 2)):slice_sample是dplyr官方推荐的随机抽样函数,这里的min(n(), 2)是关键——它会自动判断每个组的行数:b=1的组有3行,就随机选2行;b=2的组只有2行,就全部保留,完美匹配你要的结果。replace = FALSE是无放回抽样,也是默认值,写出来只是让逻辑更清晰。
  • ungroup():这一步必须加!如果省略,结果会是grouped_df类型(分组tibble),取消分组后才能回到你需要的普通tibble类型。
  • arrange(b, a):因为抽样是随机的,直接输出的行顺序可能和你给的示例不一样,加个排序就能让结果结构完全贴合你想要的tibble(a = c(1,3,4,5), b = c(1,1,2,2))(当然b=1组随机抽的两行可能是1&2、2&3或者1&3,都是符合要求的)。

运行这段代码后,你得到的downsampled_tbl就是标准的tibble类型,完全满足你的需求~

内容的提问来源于stack exchange,提问作者Christopher Costello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:38:21