为什么此列表不能作为元素存储在数据框中?

时间:2016-01-27 09:07:42

标签: r list dataframe element

我运行了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
}

1 个答案:

答案 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放弃了将右侧对象强制转换为行和列,并将其作为列表的包装列表接受。这或多或少与你所做的相同。

所以至少它可以重现。但如果这是一个好主意?我会否认它。

数据框用于表格数据,而不是用于将复杂对象包装到列表列表中。