将数据帧拆分为较小的块

时间:2014-12-20 12:54:24

标签: r split dataframe

假设我有以下data.frame

> df <- data.frame(a=rep(1:3),b=rep(1:3),c=rep(4:6),d=rep(4:6))
> df
  a b c d
1 1 1 4 4
2 2 2 5 5
3 3 3 6 6

我希望能够将此df拆分为两个框架df1df2。我希望df1成为df的前两列,df2成为df的后两列。有没有办法在代码中执行此操作,以便我不必手动执行以下操作:

> df1 <- df[,1:2]
> df1
  a b
1 1 1
2 2 2
3 3 3
> df2 <- df[,3:4]
> df2
  c d
1 4 4
2 5 5
3 6 6

这很好,因为我正在处理的问题有不同数量的列,我只想创建n = ncol(df)/2数据帧。因此,如果上述示例中还有2列,df3将为df[,5:6]

谢谢!

3 个答案:

答案 0 :(得分:4)

假设您的data.frame有一对列数,这是一个非常短的代码:

>lapply(seq(1,length(df),2), function(u) df[u:(u+1)])
[[1]]
  a b
1 1 1
2 2 2
3 3 3

[[2]]
  c d
1 4 4
2 5 5
3 6 6

答案 1 :(得分:1)

这可以提供帮助:

df <- data.frame(a=rep(1:3),b=rep(1:3),c=rep(4:6),d=rep(4:6),e=rep(4:6),f=rep(4:6) )

mylist <- list()
for ( i in 1:ncol(df) ) {
  if (i %% 2 == 0) {
    mylist[[length(mylist)+1]] <-  df[, (i-1):i ]
  }
}

输出:

> mylist
[[1]]
  a b
1 1 1
2 2 2
3 3 3

[[2]]
  c d
1 4 4
2 5 5
3 6 6

[[3]]
  e f
1 4 4
2 5 5
3 6 6

我在这里使用6列向您展示它适用于任意数量的列(假设列数为偶数)。您想要的所有数据帧都存储在一个列表中(因此您有一个数据帧列表),您可以将每个数据帧作为mylist[[ <number_here> ]]访问。

希望这有帮助!

答案 2 :(得分:1)

以下方法适用于evenodd列数

 fsplit <- function(df, n, Ncol=TRUE){
      lst <- lapply(split(seq_along(df), as.numeric(gl(ncol(df),
                               n, ncol(df)))), function(i) df[i])
        if(Ncol){
             lst[sapply(lst, ncol)==n]
             }
        else {
           lst
            }
       }

fsplit(df,2)
fsplit(df,3)
fsplit(df,3,FALSE)
fsplit(df1,2)

数据

 set.seed(24)
 df1 <- as.data.frame(matrix(sample(1:10, 7*3, replace=TRUE), ncol=7))