strsplit() 输出为 r 中的数据帧

Posted

技术标签:

【中文标题】strsplit() 输出为 r 中的数据帧【英文标题】:strsplit() output as a dataframe in r 【发布时间】:2019-02-24 19:57:32 【问题描述】:

我从 Python 中的模型得到一些结果,我将其保存为 .txt 以在 RMarkdown 中呈现。

.txt 是这个。

             precision    recall  f1-score   support

          0       0.71      0.83      0.77      1078
          1       0.76      0.61      0.67       931

avg / total       0.73      0.73      0.72      2009

我将文件读入r,

x <- read.table(file = 'report.txt', fill = T, sep = '\n')

当我保存这个时,r 将结果保存为一列 (V1) 而不是下面的 5 列,

                                                    V1
1              precision    recall  f1-score   support
2           0       0.71      0.83      0.77      1078
3           1       0.76      0.61      0.67       931
4 avg / total       0.73      0.73      0.72      2009

我尝试使用strsplit() 拆分列,但不起作用。

strsplit(as.character(x$V1), split = "|", fixed = T)

可能是strsplit() 是不是正确的做法?我如何解决这个问题,以便我有一个 [4x5] 数据框。

非常感谢。

【问题讨论】:

老实说,我认为你应该回到你的 Python 脚本,让它输出一个更适合read.table 的格式,它需要一些列,每个列都有一个标题。否则,您将不得不在 R 中参加一些奥运会。 让 python 将其输出导出到适当的 csv 文件更容易 如果您喜欢 r 解决方案,您应该能够使用矩阵 (data = x$V1,ncol = 5, byrow = TRUE) 做到这一点。假设 x$V1 给出了所有数据的向量 x$V1[1] == 0, x$V1[2] == 0.71, x$V1[3] == 0.83 等等,那么矩阵命令应该以所需的形式重组数据(希望:D) 我可能应该按照建议回到 python,直到找到更清洁的 R 解决方案。这在 R 中非常复杂。 我认为不应该。也许我在上一篇文章中弄错了,现在我认为这可以通过在 read.table 中正确指定 sep 和 header 来解决。也许 read.table(file = 'report.txt', header = TRUE, sep = '\t') 已经成功了吗? 【参考方案1】:

不是很优雅,但这很有效。首先我们读取原始文本,然后我们使用正则表达式来清理、删除空格并转换为 csv 可读格式。然后我们读取 csv。

library(stringr)
library(magrittr)
library(purrr)

text <- str_replace_all(readLines("~/Desktop/test.txt"), "\\s(?=/)|(?<=/)\\s", "") %>% 
  .[which(nchar(.)>0)] %>% 
  str_split(pattern = "\\s+") %>% 
  map(., ~paste(.x, collapse = ",")) %>% 
  unlist

read.csv(textConnection(text))
#>           precision recall f1.score support
#> 0              0.71   0.83     0.77    1078
#> 1              0.76   0.61     0.67     931
#> avg/total      0.73   0.73     0.72    2009

由reprex package (v0.2.0) 于 2018 年 9 月 20 日创建。

【讨论】:

感谢您解决问题。 textConnection() 来自哪个包?同样如前所述,在 r 中修复很多马戏团。我在这里发布了一个替代 python 到 csv 输出。 哦,我绝对同意最初修复会更容易。我只是想提供一个替代方案。 textConnection 是一个基本的 R 函数。【参考方案2】:

由于让 python 输出 csv 更简单,我在这里发布了一个替代方案。以防万一它有用,即使在 python 中也需要一些工作。

def report_to_csv(report, title):
    report_data = []
    lines = report.split('\n')

    # loop through the lines
    for line in lines[2:-3]:
        row = 
        row_data = line.split('      ')
        row['class'] = row_data[1]
        row['precision'] = float(row_data[2])
        row['recall'] = float(row_data[3])
        row['f1_score'] = float(row_data[4])
        row['support'] = float(row_data[5])
        report_data.append(row)

    df = pd.DataFrame.from_dict(report_data)

    # read the final summary line
    line_data = lines[-2].split('     ')
    summary_dat = []
    row2 = 
    row2['class'] = line_data[0]
    row2['precision'] = float(line_data[1])
    row2['recall'] = float(line_data[2])
    row2['f1_score'] = float(line_data[3])
    row2['support'] = float(line_data[4])
    summary_dat.append(row2)

    summary_df = pd.DataFrame.from_dict(summary_dat)

    # concatenate both df. 
    report_final = pd.concat([df,summary_df], axis=0)
    report_final.to_csv(title+'cm_report.csv', index = False)

函数灵感来自 this solution

【讨论】:

以上是关于strsplit() 输出为 r 中的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

str.split(/\s+/) 简单JS问题

从 R 中的整个数据帧中删除空格

R:反斜杠()分割

当需要的拆分字符向量对于变量 (R) 中的所有观测值不一致时使用 strsplit

R字符串拆分函数(strsplit)中的非字符参数

内部使用 strsplit 的用户定义函数的语法