r语言 - 一次处理多个 csv 表并将结果粘贴到新列上



我正在学习如何在 R 中使用for循环,但这一次对于我能做的事情来说似乎有点复杂。

我有几个名称格式的文件"collar41361_41365.0.x.csv",并且想进行一系列计算,结果将在同一文件的新列上。

我当时成功地为一个文件执行此操作,但希望自动执行所有"collar41361_41365.0.x.csv"文件的过程。

下面是"collar41361_41365.0.x.csv"文件外观的一小部分示例:

> collaraccuracy<-fread("collar41361_41365.0.8.csv",stringsAsFactors = F)
> print(collaraccuracy)
V1  observed predicted probability results1 results2       results
1:   1   Head-up Vigilance   0.2727273 NEGATIVE     TRUE TRUE_NEGATIVE
2:   2   Head-up   Grazing   0.7272727 NEGATIVE     TRUE TRUE_NEGATIVE
3:   3   Head-up   Grazing   0.7272727 NEGATIVE     TRUE TRUE_NEGATIVE
4:   4   Head-up   Grazing   0.5454545 NEGATIVE     TRUE TRUE_NEGATIVE
5:   5   Head-up   Grazing   0.7272727 NEGATIVE     TRUE TRUE_NEGATIVE

我需要计算"TRUE_POSITIVES"(TP)、"FALSE_POSITIVES"(FP)、"TRUE_NEGATIVES"(TN) 和"FALSE_NEGATIVES"(FN) 的总数,并计算一系列度量,例如:

1) 精度 = (tn+tp)/(tn+tp+fn+fp)

2) 精度 = TP/(TP+FP)

3) 召回率 = TP/(TP+FN)

这是我在分析单个文件时进行的方式:

collaraccuracy<-fread("collar41361_41365.0.8.csv",stringsAsFactors = F)
tp<-length(grep("TRUE_POSITIVE", collaraccuracy$results))
fp<-length(grep("FALSE_POSITIVE", collaraccuracy$results))
tn<-length(grep("TRUE_NEGATIVE", collaraccuracy$results))
fn<-length(grep("FALSE_NEGATIVE", collaraccuracy$results))

accuracy = (tn+tp)/(tn+tp+fn+fp)
accuracy
precision = tp/(tp+fp)
precision
recall = tp/(tp+fn)
recall

我想创建一个for循环,它将:

1)读取所有名称格式的文件"collar41361_41365.0.x.csv"并计算每个文件的accuracyprecisionrecall值。

2)为每个文件创建三个新列,标题为"accuracy""precision""recall",然后将公式的结果粘贴到下面。

任何帮助都非常感谢!

这样的东西应该可以工作。不确定我是否完全理解预期的输出

# setwd('') # to folder where your csv files are
# change 'file.csv' to 'collar41361_41365.0'
f <- list.files(path = getwd(), full.names = F, pattern = 'file.csv')
dfs <- list()
for(i in 1:length(f)){
collaraccuracy <- data.table::fread(f[i],stringsAsFactors = F)
tp <- length(grep("TRUE_POSITIVE", collaraccuracy$results))
fp <- length(grep("FALSE_POSITIVE", collaraccuracy$results))
tn <- length(grep("TRUE_NEGATIVE", collaraccuracy$results))
fn <-length(grep("FALSE_NEGATIVE", collaraccuracy$results))
# append the results to the files 
collaraccuracy$accuracy <- (tn+tp)/(tn+tp+fn+fp)
collaraccuracy$precision <- tp/(tp+fp)
collaraccuracy$recall <- tp/(tp+fn)
# you make way to write them to a different directory
data.table::fwrite(collaraccuracy, file = paste0('new',f[i]))
}

最新更新