R语言中如何抽取数据框样本后将对应样本从原数据框移除
问题根因
df[-s]失效的核心原因是:sample_n(df, 100)返回的s是独立的100行数据框对象,不是被抽中行的整数位置向量。R里方括号内-加对象的删法,默认是针对列索引做操作,你把整个数据框塞进去自然没法正确删除对应行。
可行实现方式
- 索引法(最稳妥,无重复行匹配问题)
抽样时优先存行索引,不要直接存抽样结果,后续删行、二次抽样都直接基于索引操作:library(dplyr) # 生成100个不重复的行位置索引 picked_idx <- sample(x = nrow(df), size = 100, replace = FALSE) # 第一次抽取的100行样本 s1 <- df[picked_idx, ] # 移除已抽中行后的剩余400行数据集,直接覆盖原df也可以 df <- df[-picked_idx, ] # 后续抽第二批100行直接操作更新后的df即可 s2 <- sample_n(df, 100) - 反连接法(适配已经生成了s数据框、不想重跑抽样的场景)
如果你已经拿到了抽样结果s,可以通过反连接匹配剔除已选中的行:library(dplyr) # 给原df和样本s临时加行号作为匹配键 df <- df %>% mutate(.row_id = row_number()) s <- s %>% mutate(.row_id = row_number()) # 保留所有不在s中的行,删除临时匹配键 df <- df %>% anti_join(s, by = ".row_id") %>% select(-.row_id)
注意:如果你的原始数据存在多列值完全相同的重复行,反连接法可能误删同值的未抽中行,这种场景优先用索引法。
内容的提问来源于stack exchange,提问作者Egon Carter
相关产品推荐
相关产品推荐

