【问题标题】:How to save the output of multiple confusionMatrix to single csv file in r?如何将多个confusionMatrix的输出保存到r中的单个csv文件?
【发布时间】:2020-09-19 15:12:26
【问题描述】:

我使用以下代码为多个站点计算了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 r-caret confusion-matrix


    【解决方案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)
    }
    

    【讨论】:

    • 其实我可以单独做。所以,我不想单独做,因为我有很多电台。为了代表,我只提供了 2 个站点。
    • @Bappa Das 这个更新后的代码有效吗?如果是这样,请关闭此问题。
    • 制作row.names = T 更好,因为我可以在输出中包含类名。如果您能详细说明第二个 for 循环的实用程序会更好。
    • 如能回答请访问this
    • 感谢您接受我的回答。我已经用一些注释对其进行了更新,以解释其背后的逻辑。如果我有答案/问题,我会看看其他帖子并回复。最美好的祝愿!
    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2021-10-27
    • 2020-08-10
    • 2021-11-09
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多