0

我最近遇到了一个问题,即输出一个大的 data.table 来分隔每 x 行的文本文件。第三方应用程序不接受我的大文件,我注意到它接受了大约 20%,所以我决定拆分文件并通过 6 个单独的文件导入。

我通过以下方式解决了它,因为我无法在 stackoverflow 和 write.table 的文档中找到更好的方法;然而,对于潜在的未来应用,我想知道有什么比这更有效的方法。

dat <- data.frame(a=c(rep("a",10000)),b=c(rep("b",10000))

SetSize <- dim(dat)[1]/6

Set1 <- 1:SetSize
Set2 <- SetSize:(SetSize*2)
Set3 <- (SetSize*2):(SetSize*3)
Set4 <- (SetSize*3):(SetSize*4)
Set5 <- (SetSize*4):(SetSize*5)
Set6 <- (SetSize*5):dim(E.US)[1]

write.table(dat[Set1],"Input1.csv")
write.table(dat[Set2],"Input2.csv")
write.table(dat[Set3],"Input3.csv")
write.table(dat[Set4],"Input4.csv")
write.table(dat[Set5],"Input5.csv")
write.table(dat[Set6],"Input6.csv")
4

4 回答 4

1

将其输出到普通.csv文件,但(如果您在基于 Linux 或 OSX 的系统上)使用split命令将其分成多个块。例如:

# In R:
write.table(dat, "inputs.csv")

# From the command line:
split -l$(echo $(wc -l inputs.csv | sed 's/\([0-9]\) .*/\1/g' | tr -d ' ') / 6 + 1| bc) inputs.csv inputs

后者将创建六个.csv文件。中间的部分完全是可选的,如果我们想将每个文件分成六部分,它会计算我们应该使用的行数。如果你知道这个数字,比如 X,你可以用 替换上面的数字split -lX inputs.csv inputs

最后,如果您仍希望在 R 中执行此操作,您可以

six_groups <- split(tmp <- seq_len(nrow(dat)), floor(5.5 * rank(tmp) / length(tmp)))
for (group in seq_along(six_groups))
  write.csv(dat[six_groups[[i]], ], paste0("Input", i, ".csv"))
于 2014-03-23T17:17:59.017 回答
1

你想在函数中使用循环吗?

writeOut <- function(df, n){

  # your data set
  df <- df

  # the arbitrary number of cuts you want to divide the data frame into
  df$Split <- cut(nrow(df), n)

  uniqueSplits <- unique(df$Split)

  for(i in 1:uniqueSplits){

    fileName <- paste('Input', match(i, uniqueSplits), '.csv', sep = '')

    subsetted_df <- subset(df, Split == i)

    subsetted_df$Split <- NULL

    write.csv(subsetted_df, file = fileName)

  }

}

# writeOut(dat, 6)
于 2014-03-23T17:21:03.457 回答
1

这可以通过 for 循环更好地完成,例如:

numsets = 6
SetSize <- ceiling(nrow(dat)/numsets)
sets = rep(1:numsets, each=SetSize)
for (i in 1:numsets) {
    write.table(dat[sets == i], paste0("Input", i, ".csv"))
}
于 2014-03-23T17:09:49.217 回答
1
dat <- data.frame(a=c(rep("a",10000)),b=c(rep("b",10000)))

split_write.table <- function(dat, nchunks=2, filename, ...) {
  g <- seq_len(nrow(dat)) %/% (ceiling(nrow(dat)/6))
  splitDat <- split(dat, g)
  for (i in seq_along(splitDat)) {
    ff <- strsplit(filename, ".", fixed=TRUE)
    write.table(splitDat[[i]], paste0(ff[[1]][1], i, ".", ff[[1]][2]), ...)
  }
  invisible(NULL)
}

split_write.table(dat, 6, "test.csv", sep=",", col.names = NA)
于 2014-03-23T17:10:13.870 回答