将数据帧拆分为相等的部分

时间:2017-01-11 18:53:16

标签: r dataframe

我有很多8208行的数据帧,并希望将每个数据帧分成19个数据帧,每个数据帧有432行。我分配了以下功能:

splitter <- function(x) {
 a <- x[1:432,]
 b <- x[433:864,]
 c <- x[865:1296,]
 d <- x[1297:1728,]
 e<- x[1729:2160,]
 f <- x[2161:2592,]
 g <- x[2593:3024,]
 h <- x[3025:3456,]
 i <- x[3457:3888,]
 j <- x[3889:4320,]
 k <- x[4321:4752,]
 l <- x[4753:5184,]
 m <- x[5185:5616,]
 n <- x[5617:6048,]
 o <- x[6049:6480,]
 p <- x[6481:6912,]
 q <- x[6913:7344,]
 r <- x[7345:7776,]
 s <- x[7777:8208,]
assign(paste0('1',x), a, envir = globalenv())
assign(paste0('2',x), b, envir = globalenv())
assign(paste0('3',x), c, envir = globalenv())
assign(paste0('4',x), d, envir = globalenv())
assign(paste0('5',x), e, envir = globalenv())
assign(paste0('6',x), f, envir = globalenv())
assign(paste0('7',x), g, envir = globalenv())
assign(paste0('8',x), h, envir = globalenv())
assign(paste0('9',x), i, envir = globalenv())
assign(paste0('10',x), j, envir = globalenv())
assign(paste0('11',x), k, envir = globalenv())
assign(paste0('12',x), l, envir = globalenv())
assign(paste0('13',x), m, envir = globalenv())
assign(paste0('14',x), n, envir = globalenv())
assign(paste0('15',x), o, envir = globalenv())
assign(paste0('16',x), p, envir = globalenv())
assign(paste0('17',x), q, envir = globalenv())
assign(paste0('18',x), r, envir = globalenv())
assign(paste0('19',x), s, envir = globalenv())}

当我在数据帧上尝试代码时,收到错误消息:

分配错误(paste0(“1”,x),a,envir = globalenv()):   变量名限制为10000字节    另外:警告信息:    在assign(paste0(“1”,x),a,envir = globalenv())中:   只有第一个元素用作变量名称

1 个答案:

答案 0 :(得分:0)

特别是关于为每个数据框对象分配名称的代码,您要粘贴数字和整个“x”。这是您获得字节数和元素警告的错误。如果您想坚持使用当前代码,可以将paste0("1",x)替换为paste0("df1")

尽管如此,要诚实 assign(x, value, pos = -1, envir = as.environment(pos),inherits = FALSE, immediate = TRUE)要求x作为字符串传递,您只需将其定义为:

assign("df1", a, envir = globalenv())

您的解决方案并不是最优雅的,如果您需要对数据进行更“随机”的拆分,我建议使用其他方法,每个lmo。像 -

这样的东西
splitter<-function(x,groups=10){
  dd<-as.data.frame(x)
  dd$split<-sample(groups,size=nrow(dd),replace=T)
  for(i in 1:groups){
    ddd<-dd[dd$split==i,]
    assign(paste0("X",i),ddd,envir=globalenv())
  }
}
splitter(data.set,10)

你可以通过消除循环来逃避,但这是由你来决定的。请注意上面的代码,数据框大小不会完全相等,但应该在行中接近相等...