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

使用dplyr/tidyr拆分数据集:确保同一ID仅在单个分块中

解决按ID拆分数据集(同一ID仅在一个分块)的dplyr方案

这个问题确实很典型——直接用ntile()对原始数据的id列处理时,因为同一个ID对应多行,会被分散到不同分块里,完全不符合「同一ID仅出现在一个分块」的要求。我们需要换个思路:先给每个唯一ID分配分块标签,再把标签关联回原数据集,这样就能保证同一ID的所有行都属于同一个分块。

具体实现步骤

首先加载dplyr,并定义你的示例数据集:

library(dplyr)
test <- data.frame(id= c(1,2,3,4,4,4,4,4,6,7,8,9,9,9,9,10), val = 1:16)

步骤1:给唯一ID分配分块标签

先提取数据中所有不重复的ID,然后用ntile()给这些ID分配分块(这里以拆分3块为例):

id_block_mapping <- test %>%
  distinct(id) %>%  # 获取唯一ID集合
  mutate(block = ntile(row_number(), n = 3))  # 给每个ID分配分块编号

步骤2:关联分块标签到原数据集

通过left_join()把分块标签合并回原始数据,这样每个ID的所有行都会带上同一个分块号:

test_with_blocks <- test %>%
  left_join(id_block_mapping, by = "id")

步骤3:按分块拆分数据集

最后用group_split()按分块号拆分数据集,得到3个独立的数据框:

split_datasets <- test_with_blocks %>%
  group_split(block, .keep = FALSE)

验证效果

你可以检查某个ID的所有行是否都在同一个分块里,比如ID=4:

# 查看第一个分块中的ID=4数据
split_datasets[[1]] %>% filter(id == 4)
# 查看第二个分块中的ID=4数据(应该为空)
split_datasets[[2]] %>% filter(id == 4)

可选:随机分块

如果需要随机分配ID到不同分块(而不是按ID顺序),可以把步骤1中的ntile()替换为随机抽样:

id_block_mapping <- test %>%
  distinct(id) %>%
  mutate(block = sample(1:3, size = n(), replace = TRUE))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:32