NCI60数据集指定类别子集筛选:结果不符与维度错误求助
解决NCI60数据集筛选的两个问题
先明确核心前提
NCI60是ISLR包里的列表(list)对象,不是常规的二维数据框/矩阵,它包含两个核心部分:NCI60$data(基因表达矩阵,行对应样本、列对应基因)和NCI60$labs(每个样本的类别标签向量),这是你两个错误的根源。
问题1:筛选后出现不在g3的类别
你之前用NCI60[cancers %in% g3]的错误点:
- 首先,
cancers应该对应NCI60$labs,但就算替换后,直接对list用向量索引,只会筛选list里的元素(也就是data和labs这两个组件),根本不是筛选样本。
正确操作流程
library(ISLR) data(NCI60) # 统计每个类别的样本数量 lab_counts <- table(NCI60$labs) # 提取样本数>3的类别集合g3 g3 <- names(lab_counts)[lab_counts > 3] # 获取符合条件的样本行索引 keep_rows <- which(NCI60$labs %in% g3) # 提取筛选后的样本矩阵 subset_data <- NCI60$data[keep_rows, ] # 同步提取对应标签 subset_labs <- NCI60$labs[keep_rows] # 验证:只会显示g3中的类别 table(subset_labs)
问题2:incorrect number of dimensions错误
你用NCI60[NCI60$labs %in% g3, ]报错,是因为list是一维结构,不能用二维索引(行,列)的语法——二维索引只适用于矩阵、数据框这类二维对象。
正确写法
直接对NCI60$data这个二维矩阵做行筛选:
# 直接筛选数据矩阵的行 subset_data <- NCI60$data[NCI60$labs %in% g3, ] # 同步筛选标签 subset_labs <- NCI60$labs[NCI60$labs %in% g3]
可选:转成数据框简化操作
如果习惯用数据框的语法,可以把数据和标签合并成数据框:
nci_df <- data.frame(NCI60$data, labs = NCI60$labs) # 现在就能用数据框的筛选逻辑了 subset_df <- nci_df[nci_df$labs %in% g3, ] # 验证类别 table(subset_df$labs)
内容的提问来源于stack exchange,提问作者Datagram
相关产品推荐
相关产品推荐

