如何在r中把多个confusionMatrix的输出保存到单个csv文件中?

问题描述 投票:2回答:1

我计算了 confusionMatrix() 多站使用以下代码

    library(tidyverse)
    result <- df %>% 
      xtabs( ~ Observed + Forecasted + Station, data =.) %>% 
      array_tree(.,margin=3) %>% 
      map(~caret::confusionMatrix(as.table(.x)))

然后我试着用下面的代码来计算不同的基于混淆矩阵的指数。

    as.matrix(result, what = "classes")
    as.matrix(result, what = "overall")

其中返回。

   #>          [,1]   
   #> Aizawl   List,6  
   #> Serchhip List,6  

我的问题是,我怎样才能把输出结果写进 .csv 文件?

下面是一些示例数据来帮助说明我的问题。

    df = structure(list(Station = c("Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", "Aizawl", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", 
    "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip", "Serchhip"
    ), Observed = c(1, 1, 1, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 
    1, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 3, 3, 4, 1, 1, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    4, 4, 4, 3, 4, 1, 1, 1, 1, 1, 3, 5, 5, 5, 3, 1, 1, 3, 1, 1, 1, 
    1, 1, 5, 3, 4, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1, 1, 1, 4, 4, 5, 
    1, 5, 4, 5, 5, 5, 5, 1, 5, 1, 4, 5, 4, 4, 5, 4, 5, 5, 3, 1, 5, 
    3, 4, 3, 4, 5, 5, 5, 5, 4, 4, 5, 4, 4, 5, 5, 5, 5, 4, 5, 5, 5, 
    5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 3, 5, 5, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 
    3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 
    3, 3, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1, 
    1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 
    6, 5, 5, 4, 1, 5, 1, 1, 1, 1, 4, 5, 5, 5, 5, 5, 5, 1, 1, 4, 1, 
    4, 4, 4, 5, 1, 1, 4, 3, 5, 4, 5, 5, 5, 5, 5, 4, 4, 4, 4, 5, 1, 
    6, 5, 5), Forecasted = c(1, 1, 1, 5, 5, 1, 1, 1, 5, 5, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, 4, 1, 1, 5, 3, 1, 
    1, 1, 4, 5, 5, 5, 5, 1, 1, 1, 5, 5, 1, 5, 5, 5, 4, 5, 4, 4, 4, 
    3, 4, 4, 1, 1, 5, 5, 4, 4, 4, 1, 1, 1, 4, 4, 4, 4, 4, 4, 1, 1, 
    5, 4, 4, 5, 4, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 5, 4, 1, 1, 
    4, 4, 5, 5, 5, 5, 1, 4, 5, 5, 1, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 
    5, 5, 5, 5, 5, 5, 1, 1, 1, 5, 4, 1, 1, 1, 5, 4, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 6, 5, 5, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 5, 5, 4, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 4, 4, 4, 1, 4, 1, 3, 
    1, 1, 1, 4, 4, 4, 4, 4, 4, 1, 1, 1, 4, 4, 3, 5, 5, 5, 4, 3, 5, 
    5, 5, 5, 5, 4, 5, 5, 5, 4, 5, 4, 4, 5, 5, 4, 4, 5, 4, 1, 4, 4, 
    5, 5, 4, 5, 4, 5, 4, 5, 5, 5, 1, 4, 5, 5, 5, 4, 5, 5, 5, 5, 5, 
    5, 5, 5, 5, 5, 6)), row.names = c(NA, 333L), class = "data.frame")

预先感谢你能提供的任何帮助!

r tidyverse caret confusion-matrix
1个回答
1
投票

使用以下代码的问题 as.matrix() 在这个例子中,你正在创建一个列表的功能。 取而代之的是

as.matrix(result, what = "classes")
as.matrix(result, what = "overall")

试着创建数据框架来存放你的结果,你可以通过迭代你的原始数据来填充。result 列表。 下面的代码应该可以做到这一点。

## iterate through all six parts of the confusionMatrix: "positive", "table", "overall", "byClass", "mode", "dots" 
for(i in 1:length(names(result[[1]]))){
  ##create a data frame to house the data for export
  data <- data.frame()
  ## iterate through all results; in the example we have Aizawl" and "Serchhip"
  for(j in 1:length(names(result))){
    ## load the data into a data frame
    df <- data.frame(result[[j]][i])
    ## if data is empty no need to alter or append to data frame so skip to next
    if(nrow(df)==0){next}
    ## add a name column for identifying between result sets; in the example we have Aizawl" and "Serchhip"
    df$name <- names(result)[j]
    ## append the loaded data to the data frame for export
    data <- rbind(data, df)
  }
  ## if data is empty no need to export, therefore skip to next
  if(nrow(data)==0){next}
  ## write the data to a csv with the name of the part of the condusionMatrix it contains
  ## row.names changed to TRUE based on OP's comments
  write.csv(data, file = paste0(names(result[[1]])[i],".csv"), row.names = TRUE, na = "")
}

除非,你希望在使用 write.csv() 函数。 在这种情况下,你可以使用

for(i in 1:length(names(result[[1]]))){
  data <- data.frame()
  for(j in 1:length(names(result))){
    df <- data.frame(result[[j]][i])
    if(nrow(df)==0){next}
    df$name <- names(result)[j]
    data <- rbind(data, df)
  }
  if(nrow(data)==0){next}
  assign(names(result[[1]])[i], data)
}
© www.soinside.com 2019 - 2024. All rights reserved.