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

如何从R语言数据集mushrooms中筛选出不在训练集的行?

解决方法:筛选原数据集中不在训练集内的行

看起来你踩了个常见的小坑——虽然typeof()返回的是list,但read.csv()导入的其实是data.frame(本质是由列组成的list),直接对它用逻辑取反是行不通的,因为它会逐列处理,而不是按行匹配。下面给你几种靠谱的解决方案:

方法1:利用训练集的行索引(最推荐)

如果你划分训练集时是通过采样行索引得到的(比如用sample()),那直接对索引取反就能快速得到测试集:

# 假设你是这么划分训练集的(建议加set.seed保证结果可重复)
set.seed(123)
train_indices <- sample(nrow(mushrooms), size = nrow(mushrooms)/3)
mushrooms.training_set <- mushrooms[train_indices, ]

# 直接取反索引得到原数据中不在训练集的行
mushrooms.test_set <- mushrooms[-train_indices, ]

这种方法高效又不容易出错,以后划分数据集时建议保留行索引哦。

方法2:用dplyr的anti_join()(简洁直观)

如果已经没保留训练集的行索引,用dplyr包的anti_join()函数最省心——它专门用来筛选出在第一个数据框中、但不在第二个数据框里的行:

library(dplyr)

# 一键得到目标结果
mushrooms.test_set <- anti_join(mushrooms, mushrooms.training_set)

dplyr会自动帮你比对所有列的内容,不需要手动处理行匹配逻辑。

方法3:Base R手动匹配行内容

如果不想额外加载包,也可以用Base R把每行转成唯一字符串再匹配:

# 选一个数据里没有的分隔符(比如"|~|"),把每行转成字符串
train_row_strings <- apply(mushrooms.training_set, 1, paste, collapse = "|~|")
all_row_strings <- apply(mushrooms, 1, paste, collapse = "|~|")

# 筛选不在训练集字符串集合里的行
mushrooms.test_set <- mushrooms[!all_row_strings %in% train_row_strings, ]

注意:分隔符要选数据集里不存在的字符组合,避免因为数据本身包含分隔符导致匹配错误。

为什么你之前的方法不对?

  • mushrooms[c(!mushrooms.training_set),]:对data.frame取反!会逐列生成逻辑向量,c()把这些向量拼成一个长逻辑序列,用它索引行肯定会得到错误结果。
  • !duplicated(mushrooms.training_set):duplicated()是检查列的重复(因为data.frame是列的list),和行匹配完全不相关,自然得不到正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:26:08