如何在R中将dslabs包的tissue_gene_expression列表转为数据框?
使用caret训练
tissue_gene_expression数据集时出现维度错误 我正在R中构建基础机器学习模型,使用dslabs包中的tissue_gene_expression大型列表数据集。此前用数据框格式的数据集时,以下代码能正常运行:
library(caret) library(rpart) library(dslabs) data("any_dataset_here") set.seed(1) fit <- train(y ~ x, method = "rpart", tuneGrid = data.frame(cp = seq(0, 0.1, 0.01)), data = any_dataset_here) plot(fit)
但将这套方法应用到tissue_gene_expression时,出现了如下错误:
Error in data[0, cols, drop = FALSE] : incorrect number of dimensions
我尝试过多种列表转数据框的方法,还试过拆分数据集后合并:
x <- tissue_gene_expression$x y <- tissue_gene_expression$y data <- merge(as.data.frame(x), as.data.frame(y))
但都没能解决问题,现在陷入困境,应该有简单的解决方案,求帮助。
数据集结构说明
dslabs包中tissue_gene_expression的样例结构:
tissue_samp <- list(x = structure(c(9.82567961156526, 9.63124675443192, 9.6905477405041, 8.32716269991154, 8.54282675765235, 8.47648576924408, 5.49938189571546, 5.64429228822371, 5.71718693776275, 8.69237073974266, 8.83367868047273, 8.49862302902272), dim = 3:4, dimnames = list(c("cerebellum_1", "cerebellum_2", "cerebellum_3"), c("MAML1", "LHPP", "SEPT10", "B3GNT4"))), y = structure(c(1L, 1L, 1L), levels = c("cerebellum", "colon", "endometrium", "hippocampus", "kidney", "liver", "placenta"), class = "factor"))
样例中x为3×4矩阵,y为长度3的因子。真实数据集的结构:
str(tissue_gene_expression) # List of 2 # $ x: num [1:189, 1:500] 9.83 9.63 9.69 9.99 9.58 ... # ..- attr(*, "dimnames")=List of 2 # .. ..$ : chr [1:189] "cerebellum_1" "cerebellum_2" "cerebellum_3" "cerebellum_4" ... # .. ..$ : chr [1:500] "MAML1" "LHPP" "SEPT10" "B3GNT4" ... # $ y: Factor w/ 7 levels "cerebellum","colon",..: 1 1 1 1 1 1 1 1 1 1 ...
解决方案
问题出在合并数据的方式错误:merge会按行/列名匹配,导致样本和标签错位。正确做法是把矩阵x转成数据框后,直接添加y列,保证一一对应:
library(caret) library(rpart) library(dslabs) data("tissue_gene_expression") # 转换矩阵并添加标签列 df <- as.data.frame(tissue_gene_expression$x) df$y <- tissue_gene_expression$y # 训练模型(用所有特征列预测y) set.seed(1) fit <- train(y ~ ., method = "rpart", tuneGrid = data.frame(cp = seq(0, 0.1, 0.01)), data = df) plot(fit)
核心说明:
as.data.frame(tissue_gene_expression$x)将矩阵转成数据框,每行对应一个样本,每列对应一个基因,维度完全匹配- 直接添加
y列避免了merge带来的错位问题 - 公式用
y ~ .表示用所有特征列预测y,替代原来的y ~ x(原写法仅适用于数据框内有单独x列的场景)
内容的提问来源于stack exchange,提问作者The Flaming Man
相关产品推荐
相关产品推荐

