将数据帧R分割为相等的部分并组成列表

时间:2015-03-15 21:42:57

标签: r

让我有这样一个数据框(df);

col1  col2  col3  col4  col5  col6
12    15    21    19    45    43
37    77    90    4     0     51

即;

df<-data.frame(col1=c(12,37),col2=c(15,77),col3=c(21,90),col4=c(19,4),col5=c(45,0),col6=c(43,51))

我想将df拆分成组,并用这些组组成一个列表。例如,让df分成2个相等的部分

DF1:

col1  col2  col3  
12    15    21   
37    77    90   

DF2:

col4  col5  col6
19    45    43
4     0     51

并撰写一份清单:

列表[1]:

df1

列表[2]:

df2

主要目的是撰写清单。但是,分割数据帧的数量可以改变。我怎么能用R做这个?在任何帮助下我都会很高兴。非常感谢。

2 个答案:

答案 0 :(得分:3)

这是另一种类似的方法

我们可以定义一个辅助函数,它将根据给定的n

拆分数据集
splitdf <- function(df, n) {
  indx <- matrix(seq_len(ncol(df)), ncol = n)
  lapply(seq_len(n), function(x) df[, indx[, x]])
}

然后你可以玩不同的n s

splitdf(df, 3)
# [[1]]
# col1 col2
# 1   12   15
# 2   37   77
# 
# [[2]]
# col3 col4
# 1   21   19
# 2   90    4
# 
# [[3]]
# col5 col6
# 1   45   43
# 2    0   51

或者

splitdf(df, 2)
# [[1]]
# col1 col2 col3
# 1   12   15   21
# 2   37   77   90
# 
# [[2]]
# col4 col5 col6
# 1   19   45   43
# 2    4    0   51

splitdf(df, 1)
# [[1]]
# col1 col2 col3 col4 col5 col6
# 1   12   15   21   19   45   43
# 2   37   77   90    4    0   51

答案 1 :(得分:1)

使用split将列和lapply拆分为子集::

的一个选项
lapply(split(colnames(df),rep(c(1,2),each=ncol(df)/2)),
+        function(x)df[x])
$`1`
  col1 col2 col3
1   12   15   21
2   37   77   90

$`2`
  col4 col5 col6
1   19   45   43
2    4    0   51

通常更容易按行拆分data.frame,因此您只能使用拆分。在这里,你也可以使用transpose

做同样的事情
 lapply(split(as.data.frame(t(df)),rep(c(1,2),each=ncol(df)/2)),t)