首页 > 解决方案 > 在for.loop中将R中的多个文件作为字符串读取

问题描述

我有一个代码在执行时从一个文件夹中读取两个不同的 csv 文件。我需要在这种情况下使用 for 循环多次执行此操作并将输出写入“bsc_.csv”形式的单独 csv 文件。两个输入 csv 文件的文件格式是“base_.csv”和“fut_.csv”。这些文件是递增编号的,这就是我需要迭代的模式。示例代码附在下面。

library('CDFt')
d1<-read.csv("base1.csv",header=TRUE)
d2<-read.csv("fut1.csv",header=TRUE)
A1<-d1[,2]
A2<-d1[,3]
A3<-d2[,2]
CT<-CDFt(A1,A2,A3)
x<-CT$x
FGp<-CT$FGp
FGf<-CT$FGf
FRp<-CT$FRp
FRf<-CT$FRf
ds<-CT$DS
d<-round(ds,3)
dat<-replace(d,d<0,0)
write.table(dat,"bsc1.csv", row.names=F,na="NA",append=T, quote= FALSE, sep=",", col.names=F)

标签: rcsvlapply

解决方案


试试这个(未经测试):

bases <- list.files(pattern = "base[0-9]*\\.csv$")
futs <- list.files(pattern = "fut[0-9]*\\.csv$")

mismatches <- setdiff(gsub("^base", "", bases), gsub("^fut", "", futs) )
if (length(mismatches)) {
  warning("'bases' files not in 'futs': ", paste(sQuote(mismatches), collapse = ", "))
  bases <- setdiff(bases, paste0("base", mismatches))
}
# and the reverse
mismatches <- setdiff(gsub("^fut", "", futs), gsub("^base", "", bases) )
if (length(mismatches)) {
  warning("'futs' files not in 'bases': ", paste(sQuote(mismatches), collapse = ", "))
  futs <- setdiff(futs, paste0("fut", mismatches))
}

ign <- Map(function(fb, ff) {
  bdat <- read.csv(fb, header = TRUE)
  fdat <- read.csv(ff, header = TRUE)
  # ...
  newfn <- gsub("^base", "bsc", fb)
  write.table(dat, newfn, ...)
}, bases, futs)

推荐阅读