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

R语言创建包含一个data frame中不在另一data frame内行的新数据框问题

问题原因分析
  • 核心问题出在dplyr::anti_join()的匹配逻辑:该函数默认基于两个数据框所有共同列的取值匹配行,而非基于行的索引位置。如果原始数据框original存在多组完全重复的行,只要某组重复行中有1行被抽到first_half中,anti_join会将original中该组的所有重复行全部排除,而非仅排除被抽中的那一行,最终导致second_half的行数少于预期的276行。
  • 次要原因:行名默认不会被anti_join当作匹配列,哪怕行名是唯一的顺序数值,只要没显式加入数据框作为列参与匹配,也不会被识别为行的唯一标识。
正确的拆分方案

方案1:直接基于行索引拆分(最简便)

不需要额外依赖包,直接通过行号取反生成第二个分片,完全不受重复行影响:

# 先生成随机抽样的行号向量
sample_idx <- sample(nrow(original), 275)
# 提取第一个分片
first_half <- original[sample_idx, ]
# 行号取反提取第二个分片
second_half <- original[-sample_idx, ]

方案2:如果需要用anti_join实现,先加唯一行标识

如果确实需要通过匹配逻辑实现拆分,先给数据框添加唯一的行ID列,再基于ID做匹配:

library(dplyr)
# 给原始数据添加唯一行标识
original_with_id <- original %>% mutate(row_id = row_number())
# 抽样生成第一个分片
first_half <- original_with_id %>% slice_sample(n = 275)
# 基于唯一ID做反连接生成第二个分片
second_half <- anti_join(original_with_id, first_half, by = "row_id")
# 可选:移除不需要的row_id列
first_half <- select(first_half, -row_id)
second_half <- select(second_half, -row_id)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 16:54:09