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

