使用循环将大型数据逐列拆分为较小的数据帧(非列表)

时间:2017-06-15 22:34:30

标签: r loops split

我有很多大数据帧。例如使用较小的那些:

dim(ch29)  
476 4283  

我需要将它拆分成更小的部分(即最多为241列的子集)。当我想分析这些较小的子集时,我的问题就出现了。

我不知道如何将 大日期框架 分组为 较小的数据框 和< strong> 不仅仅是一个列表

我还希望在循环中完成所有这些操作,并在循环中为新创建的较小数据帧提供唯一名称。

chunk=241
df<-ch29
n<-ceiling(ncol(df)/chunk)

for (i in 1:n) {
  xname <- paste("ch29", i, sep="_")
  cat("_", xname)
  assign(xname, split(df, rep(1:n, each=chunk, length.out=ncol(df))))
}

2 个答案:

答案 0 :(得分:2)

我不确定你要做什么,或者你想如何选择每个数据框中的列,但这里有一个选项的例子:

# Fake data
set.seed(100)
ch29 = as.data.frame(replicate(4283, rnorm(476)))

# Number of columns we want in each split data frame
ncols = floor(ncol(ch29)/20)

# Start column for each split data frame
start = seq(1,ncol(ch29),ncols)

# Split ch29 into a bunch of separate data frames
df.list = lapply(setNames(start, paste0("ch29_", start, "_", start+ncols-1)), 
                 function(i) ch29[ , i:min(i+ncols-1,ncol(ch29))])

您现在有一个列表df.list,其中每个列表元素都是ncolsch29列的数据框,但列表的最后一个元素除外1和ncols列。此外,每个列表元素的名称是父数据框的名称(ch29)以及从中绘制子集数据框的列范围。

答案 1 :(得分:1)

尝试

for (i in 1:3) { # i = 1
  xname = paste("ch29", i, sep = "_")
  col.min = (i - 1) * chunk + 1
  col.max = min(i * chunk, ncol(df))
  assign(xname, df[,col.min:col.max])
}

换句话说,使用符号df[,a:b],其中a < b,以获取仅包含df列到a的数据帧b的子集