将表写入R中的多个文件

时间:2014-05-09 20:23:32

标签: r

看似简单的问题,但我不知道循环语法和变量赋值如何在R中很好地工作。我有一个6900行表,我想解析成10个相同大小的文本文件。我的代码如下,但我如何设计一个循环并迭代文件名?

write.table(clipboard[1:619,1], 
              "mydata1.txt",sep="\t")
  write.table(clipboard[619:1238,1], 
              "mydata2.txt",sep="\t")
  write.table(clipboard[1238:1857,1], 
              "mydata3.txt",sep="\t")
  write.table(clipboard[1857:2476,1], 
              "mydata4.txt",sep="\t")
  write.table(clipboard[2476:3095,1], 
              "mydata5.txt",sep="\t")
  write.table(clipboard[3095:3714,1], 
              "mydata6.txt",sep="\t")
  write.table(clipboard[3714:4333,1], 
              "mydata7.txt",sep="\t")
  write.table(clipboard[4333:4952,1], 
              "mydata8.txt",sep="\t")
  write.table(clipboard[4952:5571,1], 
              "mydata9.txt",sep="\t")
  write.table(clipboard[5571:6190,1], 
              "mydata10.txt",sep="\t")

1 个答案:

答案 0 :(得分:2)

手动方式

我认为使用IO循环不是一个问题:

for (i in 1:10) {
  start <- 1 + (i-1) * nrow(clipboard) / 10
  end <- i * nrow(clipboard) / 10
  fname <- paste("mydata", i ,".txt", sep="")
  write.table(x=clipboard[start:end, 1], file=fname, sep="\t")
}

请注意,这假设它实际上可以分成10个大小相同的文件!

正确完成,write.split:

这个方法实际上(当不能完全分割时)为余数创建一个额外的文件。

我使用此splitter创建了一个数据列表,然后将其并行用于我的包correlate中的某些统计计算。在这里,它实际上意味着我们可以并行编写文件。请注意,这对于小文件来说毫无意义;甚至可能更慢。

# Helper to split the data in chunks
splitter <- function(x, splitsize) {
  nr <- nrow(x)
  if (splitsize > nr) {
    splitsize <- nr
  }
  splits <- floor(nr / splitsize)
  splitted.list <- lapply(split(x[seq_len(splits*splitsize), ],
                          seq_len(splits)), function(x) matrix(x, splitsize))
  if (nr %% splitsize != 0) {
    splitted.list$last <- x[(splits * splitsize + 1):nr, ]
  }
  return(splitted.list)
}

write.split <- function(x, chunks, file.prefix, file.extension, cores = 1, ...) {
  splitsize <- nrow(x) / chunks
  splitted.list <- splitter(x, splitsize)
  if (cores == 1) {
    sapply(names(splitted.list), function(z) 
           write.table(splitted.list[z],
                       file = paste(file.prefix, z, file.extension, sep=""),
                       ...))
  } else {
    # currently just the simple linux version; this won't work on Windows.
    # Upon request I'll add it
    stopifnot(require(parallel))
    mclapply(names(splitted.list), function(z) 
           write.table(splitted.list[z],
                       file = paste(file.prefix, z, file.extension, sep=""),
                       ...))
  }
} 

用法

write.split(z, chunks = 10,
            file.prefix = "mydata", file.extension = ".txt", sep="\t")

你也可以给它row.namescol.names个参数,基本上可以传递给write.table

<强>基准

Using `matrix(1:1000000, 1000)` as data.
Unit: seconds
   expr         min       lq   median       uq      max neval
 1-core    1.780022 1.990751 2.079907 2.166891 2.744904   100 
4-cores    1.305048 1.438777 1.492114 1.559110 2.070911   100

<强>扩展: 它也可以通过允许写入多行而不是块的数量来轻松扩展。