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
相关产品推荐
相关产品推荐

