我从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]数据框。
非常感谢。
答案 0 :(得分:0)
不是很优雅,但是可以。首先,我们阅读原始文本,然后使用正则表达式进行清理,删除空白并转换为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-09-20创建。
答案 1 :(得分:0)
由于使用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)
启发的功能