我运行了randomforest
模型,并尝试将模型存储为数据框中的元素。我通常用list()
包装并将其存储为元素,但在这里我似乎需要两层list(list())
。有人可以解释原因,并告诉我list(list())
是否是解决此问题的好方法?
library(randomForest)
data1 = data.frame(A = sample.int(100, size = 100))
data1$B = data1$A
data1$C = data1$A
data1$D = data1$A
report = data.frame(ntree = 500, mtry = 1:3, model = NA)
for ( i_row in 1:nrow(report)){
ntree = report[i_row, 'ntree']
mtry = report[i_row, 'mtry']
rf = randomForest( D ~ ., data = data1, importance = T, ntree = ntree, mtry = mtry)
report[i_row, 'model'] = rf # not work
report[i_row, 'model'] = list(rf) # not work
report[i_row, 'model'] = list(list(rf)) # works
}
答案 0 :(得分:1)
数据框是内部列表,如果您考虑str(rf)
,您会看到randomForest模型在内部也表示为列表。但属性具有不同的维度,因此rf
无法转换为data.frame
R会尽最大努力以合理的方式将列表或列表列表转换为data.frame。考虑
a <- data.frame(x=c(1,2),y=c(1,2))
在作业中
a[2,] <- list(x=3, y=3)
右侧列表被解释为分配给a
第二行的行。
作业a[2,] <- list(list(x=3, y=3))
失败,因为右侧不能被解释为一行,但它可以被强制转换为一列:
a[,1] <- list(list(x=3, y=3))
这导致
x y
1 3 1
2 3 2
最后,在这种情况下list(list(...))
“技巧”是:
a[2,] <- list(list(list(x=3, y=3)))
> a
x y
1 1 1
2 3, 3 3, 3
现在R放弃了将右侧对象强制转换为行和列,并将其作为列表的包装列表接受。这或多或少与你所做的相同。
所以至少它可以重现。但如果这是一个好主意?我会否认它。
数据框用于表格数据,而不是用于将复杂对象包装到列表列表中。