首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每x行Write.table (最大行?)在R中

每x行Write.table (最大行?)在R中
EN

Stack Overflow用户
提问于 2014-03-23 16:54:57
回答 4查看 567关注 0票数 0

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

我用以下方式解决了这个问题,因为我无法在堆栈溢出和write.table文档上找到更好的方法;但是,对于未来的潜在应用程序,我想知道比这更有效的方法是什么。

代码语言:javascript
复制
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")
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-23 17:17:59

将其输出到一个普通的.csv文件中,但是(如果您使用的是基于Linux或OSX的系统)使用 command将其划分为多个块。例如:

代码语言:javascript
复制
# In R:
write.table(dat, "inputs.csv")

代码语言:javascript
复制
# 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

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

最后,如果你还想在R中做这件事,你可以

代码语言:javascript
复制
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"))
票数 1
EN

Stack Overflow用户

发布于 2014-03-23 17:09:49

使用for循环可以更好地做到这一点,比如:

代码语言:javascript
复制
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"))
}
票数 1
EN

Stack Overflow用户

发布于 2014-03-23 17:10:13

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22593926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档