如何从 R 中的 randomForest 预测函数按类别对选票求和?

How can I sum votes by category from the randomForest predict function in R?

此示例代码创建了一个数据框,其初始列代表来自 10 棵树的多数票。接下来的 10 列包含模型中每棵树的分类投票。我想创建一个图表来显示每一行的投票分布。最好的方法是什么?

library(tidyverse)
library(caret)
library(randomForest)

train_index_cars <- as.vector(createDataPartition(mtcars[['cyl']],p=.8,list=FALSE,times=1))
mytrain <- mtcars[train_index_cars, ]
mytest <- mtcars[-train_index_cars, ]

car_forest <- randomForest(factor(cyl) ~., data= mytrain, ntree = 10, predict.all = T)
cartest_predicted <- as.data.frame(predict(car_forest, newdata =  mytest, predict.all = TRUE))

cartest_predicted 中 Merc 280 行的输出看起来像这样(不包括最后 6 棵树)

id aggregrate individual.1 individual.2 individual.3 individual.4
Merc 280 6 6 8 6 4

我想在每一行中添加三列,其中包含树中每个类别(4、6、8)的投票计数。我正在设想这样的输出:

individual.10 Votes_4 Votes_6 Votes_8
6 2 7 1

按条件对跨行的列求和的最佳方法是什么?我似乎无法在那里找到我真正需要的东西。此输出是否已作为 randomForest 包的一部分存在,而我只是忽略了它?

这应该有效:

# Defining temporarily function, to be passed within apply().
temp.fun = function(x) sum(x == i)

for (i in unique(cartest_predicted$aggregate)) # Iterating over possible votes.
{
  i = as.integer(i)

  cartest_predicted$temp = apply(cartest_predicted[, -1], MARGIN = 1, temp.fun) # Requested results.
  colnames(cartest_predicted)[dim(cartest_predicted)[[2]]] = paste("Votes", i, sep = "_") # Renaming new column.
}

需要 for 循环来迭代树可以投出的所有可能的选票。创建一个临时函数来为每个 i 执行您需要的操作,即为每个可能的投票。然后在 apply() 中使用这样的函数来应用于 cartest_predict 的每一行(注意 MARGIN = 1)。最后,paste用于重命名列。