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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:48:29