2017-01-11 107 views
-2

我有很多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())} 

當我嘗試上的數據幀的代碼,我得到的錯誤消息:

錯誤assign中(paste0( 「1」,x)中,一個,ENVIR = globalenv()): 變量名稱被限制爲10000字節 另外:警告消息: In assign(paste0(「1」,x),a,envir = globalenv()): 只有第一個元素用作變量名稱

+2

您可能會感興趣的是可以產生數據列表的'split'和'rep'組合.frames。閱讀gregor對[本文](http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames)的回答可能會有所幫助,以獲取關於構建和工作的技巧與data.frames列表。 – lmo

+0

x是一個data.frame,並且「paste0(1,x)產生一個data.frame因此是錯誤。你的意思是命名數據X1,X2,...等等。 – ab90hi

回答

0

特別是關於你的代碼爲你粘貼數字和整個'x'的每個數據框對象分配一個名稱。這就是你得到字節數和元素警告錯誤的地方。如果您想堅持使用您當前的代碼,您可以用paste0("df1")替換paste0("1",x)

要完全誠實的,但因爲 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) 

你可以避免使用循環,但這是你自己決定的。只需注意上面的代碼,數據幀大小不會完全相等,但應該接近於等於行...