自动捕获文件名并将其用于R中的输出文件

时间:2015-05-15 19:46:40

标签: r

最近我需要编写可重现的R代码来读取一批.csv文件,然后输出每个文件的相同名称。例如,

    filenames <- list.files(path="G:\\test")
    filenames
    [1] "mydata1.csv" "mydata2.csv" "mydata3.csv"........."mydata100.csv"
length(filenames)
100

对于这100个文件中的每一个,我需要读取文件,重新格式化,然后使用sink()以相同的名称输出.txt文件。 (感谢@Frank帮我解决了很多代码!)例如,我在第一个文件夹&#34; G:\ test&#34;中读取了第一个.csv文件mydata1。我想使用以下代码输出一个名称相同的.txt文件:mydata1

 mydata1
     value group treatment
    1   39.7     A         1
    2   53.5     A         1
    3   51.1     A         1
    4   67.8     A         1
    5   84.8     B         1
    6   80.3     B         1
    7   79.6     B         1
    8   84.3     B         1
    9   31.0     C         2
    10  32.0     C         2
    11  33.0     C         2
    12  34.0     C         2
    13   1.0     D         2
    14   2.0     D         2
    15   3.0     D         2
    16   4.0     D         2
    printables <- lapply(
    split(mydata,mydata$treatment),
     function(t)
     split(t,as.character(t$group)))
    sink("G:\\test\\mydata1.txt")
    for (t in seq_along(printables)){
     for(g in seq_along(printables[[t]])){
     print(printables[[t]][[g]],row.names=FALSE)
     cat('\n')
    }
    cat('\n\n')
    }
    sink()

因此,对于同一文件夹下的100个.csv文件,如何编写可重现的代码以自动捕获每个文件名,然后将捕获的名称放入sink()以输出具有相同名称的txt文件?

1 个答案:

答案 0 :(得分:1)

这非常简单。正如Alex A.所提到的,您可以使用grep(或者在本例中为sub)获取文件名的前缀,并在新文件名中使用它。

我做了一个更简单的工作示例。有两个csv文件,结构如下。读入这些,然后在循环中打印到接收输出。为了简单起见,我省略了你的代码,但假设它正在工作,它应该很容易替换。

file1.csv:

structure(list(file = c(1L, 1L), value = 1:2), .Names = c("file", 
"value"), class = "data.frame", row.names = c(NA, -2L))

file2.csv:

structure(list(file = c(2L, 2L), value = 3:4), .Names = c("file", 
"value"), class = "data.frame", row.names = c(NA, -2L))

R脚本:

setwd("path\\to\\files")
files <- list.files(pattern = "*.csv$")
files

for(i in 1:length(files)){
  test.data <- read.csv(file = files[i], header = TRUE, stringsAsFactors = FALSE)
  filenm <- sub("csv", "txt", files[i]) # get rid of csv suffix and replace with txt
  print(filenm) #check, to make sure the above is working
  sink(file = filenm, type = "output")
  # your code here
  print(head(test.data))
  sink()
}