【问题标题】:Formatting multiple files at once in R在 R 中一次格式化多个文件
【发布时间】:2019-02-12 13:42:43
【问题描述】:

我对 R 很陌生,所以我希望这个问题仍然很有趣。我创建了一个for 循环,它生成了 11 个 csv 文件。这是我用来帮助澄清问题的代码:

for (i in seq(0, 1, by = 0.1))
{collar$results2<-mutate(collar,results2 = case_when( (probability > i & results1 == "POSITIVE") | (probability < i & results1 == "NEGATIVE") ~ TRUE, TRUE ~ FALSE) )
as.character(collar$results2)
collaraccuracy1=paste('collar41361_41365', i, 'csv', sep = '.')
write.csv(collar,collaraccuracy1)}

如您所见,所有创建的文件都具有以下格式:collar41361_41365.i.csv,其中 ``i` 的范围从 0 到 1 每 0.1,如下所示:

[1] "collar41361_41365.0.csv"
[1] "collar41361_41365.0.1.csv"
[1] "collar41361_41365.0.2.csv"
[1] "collar41361_41365.0.3.csv"
[1] "collar41361_41365.0.4.csv"
[1] "collar41361_41365.0.5.csv"
[1] "collar41361_41365.0.6.csv"
[1] "collar41361_41365.0.7.csv"
[1] "collar41361_41365.0.8.csv"
[1] "collar41361_41365.0.9.csv"
[1] "collar41361_41365.1.csv"

现在,我想将所有文件格式化为一个,因为它们具有相同的结构(10 列、240 行和相同的列标题)和相同的名称格式。

请参阅下面的代码以及我一直在尝试接管这 11 个文件的操作。我使用了Sys.glob,因为这是在另一篇文章中提到的执行任务的最佳方式。我之前已经为单个文件编写了此操作并且它有效。我现在想一次为所有 11 个文件应用代码:

#1) Reading multiple files at one. Now, this will only work for the files with a decimal value of i in their name -which is fine-. If I was reading files with i=0 or i=1, then we'll have the pattern "collar41361_41365.*.csv". Am I right?

collaraccuracy<-lapply(Sys.glob("collar41361_41365.***.csv"), read.csv)

#2) Select only the columns with header "observed","predicted","probability","results1","results2.results2"

collaraccuracy<-fread("collar41361_41365.***.csv",select=c("observed","predicted","probability","results1","results2.results2"),stringsAsFactors = F)

#3) Rename column "results2.results2" to "results2"

colnames(collaraccuracy)<-c("observed","predicted","probability","results1","results2")

#4) Create 6th column "results" by merging columns "results1" and "results2"

collaraccuracy$results <- paste(collaraccuracy$results2, 
collaraccuracy$results1,sep="_")


#5) End of the formatting. Write new formated csv files with the pattern "collar41361_by_41365.i.csv"

collaraccuracy2=paste('collar41361_by_41365', i, 'csv', sep = '.')
write.csv(collaraccuracy,collaraccuracy2)

如您所见,我有 5 种不同的操作来计算最终应该有 9 个文件,其中 i 值为 (0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9)

我特别关心操作 1) 和 2) 中的语法,但这是迄今为止我能做的最好的。

有什么提示可以制定这个吗?任何帮助表示赞赏!

附:更新:我尝试创建一个函数并将其应用到具有lapply 的其余文件:

collarcolumns<-function(collaraccuracy1)
{collaraccuracy1<-fread(("collar41361_41365.1.csv"),select=c("observed","predicted","probability","results1","results2.results2"),stringsAsFactors = F)
colnames(collaraccuracy1)<-c("observed","predicted","probability","results1","results2")
collaraccuracy1$results <- paste(collaraccuracy1$results2, collaraccuracy1$results1,sep="_")
collaraccuracy2=paste('collar41361_by_41365', i, 'csv', sep = '.')
write.csv(collaraccuracy1,collaraccuracy2)}

lapply(Sys.glob("collar41361_41365.*.csv"), collarcolumns)

R. 打印了 11 个"NULL"s。我走对了吗?

【问题讨论】:

  • 您似乎喜欢删除和转发您的问题。如果帖子不清楚,只需编辑它而不是删除和重新发布。您删除的帖子越多,被禁止提问的机会就越高。接受答案也是帮助避免禁令的一种方法(我认为),这是一种常见的礼貌。
  • 这是你之前的一个问题:stackoverflow.com/questions/54649526/…
  • @NelsonGon 感谢您的评论。我对你的陈述有点困惑,因为我从未删除过以前的问题,因为我知道其他人可能会从共享信息中受益。我也从未转发过任何问题。如果对同一个脚本提出新问题是个问题,我很抱歉,但这两个问题都与我在创建脚本时遇到的非常不同的问题有关。我只是认为发布两个单独的问题更有用,即使它们属于同一脚本的创建,而不是编辑可能会丢失原始信息的先前问题。
  • @NelsonGon 我同意接受答案是本论坛动态非常重要的一部分这一事实。感谢您的提醒,我鼓励每个用户接受并投票答案和 cmets。
  • 在我看来,在第一个 for 循环中进行所有这些操作会更容易,并且只有在您完全按照需要格式化数据后才写入 csvs。这种方法能解决您的问题吗?

标签: r for-loop formatting


【解决方案1】:

退后一步,听起来您想对每个i 执行以下操作:

  • 添加一列results2,检查预测值是否与观察值匹配概率i
  • 添加一列results,将results1results2 连接起来。

您看到像results2.results2 这样奇怪的列名的原因是原来的for 循环是多余的;您不需要赋值语句 (collar$results2 &lt;- ...) 和 mutate。我们可以将整个事情简化为一个循环,如下所示:

for(i in seq(0, 1, by = 0.1)) {
  collar.temp = collar %>%
    mutate(results2 = case_when((probability > i & results1 == "POSITIVE") |
                                  (probability < i & results1 == "NEGATIVE") ~ T,
                                T ~ F)) %>%
    mutate(results = paste(results1, results2, sep = "_"))
  collaraccuracy1 = paste('collar41361_41365', i, 'csv', sep = '.')
  write.csv(collar.temp, collaraccuracy1)
}

再退一步,您确定要 11 个单独的表吗?在我看来,您正在有效地检查预测在各种“置信度”截止值处的准确性。一种将数据整理成整齐格式的方法是这样的,其中cutoff 是它自己的列:

collar.tidy = do.call(
  "bind_rows",
  lapply(
    seq(0, 1, by = 0.1),
    function(x) {
      collar %>%
        mutate(cutoff = x,
               results2 = case_when((probability > x & results1 == "POSITIVE") |
                                      (probability < x & results1 == "NEGATIVE") ~ T,
                                    T ~ F)) %>%
        mutate(results = paste(results1, results2, sep = "_"))
    }
  )
)

请参阅here,了解有关整洁数据的精彩介绍。您可能会想到其他方法来整理此数据集;例如,我不清楚连接另外两个列的results 列是否是绝对必要的。

【讨论】:

  • 这正是我正在尝试做的事情。我会看看这个并回复你。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 2021-09-14
  • 2013-12-03
  • 1970-01-01
  • 2018-09-18
  • 2022-11-15
  • 2016-01-16
相关资源
最近更新 更多