2014-02-20 72 views
0

我正在處理一個擁有超過2百萬條記錄的數據集。我想在整個數據集上運行一個函數deyo(),但是這個過程需要超過12個小時,但還沒有完成。我想我可能會達到公羊的極限。我怎樣才能打破數據集並且每次處理更小的數據塊並把它們放在同一個文件中?將數據幀拆分爲更小的子數據幀並在R中逐個處理命令

Deyo是一個共病包函數,它將數據框作爲一個參數。 deyo(DF)。輸出是一個向量和兩個數據幀,我只需要使用向量。 所以對於整個數據集我會做分數< -deyo(df)$分數。

+0

它將需要關於數據的外觀和函數返回的更多細節。但通常,子集數據集按照一定的標準來看,這裏看起來不是。的行就足夠了,讓我們說df [1:10000,]等,並製作數據集列表,並將您的功能應用到該列表。 – Ananta

+0

你如何在整個數據集上運行該功能?在循環中逐行排列?或者該函數是否將數據幀作爲參數? – BrodieG

+0

聽起來像是某種並行處理的良好用例......但我想這取決於「deyo」的作用。 – Thomas

回答

1
df2<-split(df, rep(1:200, each=1000)) 
sapply(df2,deyo) 
+0

deyo(df)產生一個向量和兩個數據幀。我需要的是矢量。我通常得分<-deyo(df)$分。在這種情況下,我如何獲得一個文件中每個數據子集的矢量? – Wendy

+0

'lapply(lapply(df2,deyo),「[[」,「來自deyo輸出的分數索引)' – Ananta

+0

我能夠得到它 df2 <-split(df,rep(1:200,each = 1000)) 得分<-sapply(df2,deyo)[1,] 謝謝 – Wendy

1

我在評分大型數據集時經常遇到這個問題。我用這個函數將數據幀劃分成更小的數據幀的列表:

createFrameList <- function(myData, frames){ 
# Creates a list of equally sized data frames of equal size 
    rownames(myData) <- seq(1:dim(myData)[1]) 
    return(split(myData, (as.numeric(rownames(myData)) - 1) %/% ceiling(nrow(myData)/frames))) 
    } 

然後我可以運行從parallellapplymclapply(如果我在UNIX/Linux中),以每個數據幀運行我的功能。當應用於數據框時,您會得到任何函數返回的列表。如果您的函數返回另一個幀,則可以使用plyr包中的rbind.fill將列表組裝回單幀數據幀。

+0

deyo (df)out放一個向量和兩個數據幀,我用你的方法創建了列表df2,然後 df < - do.call(「rbind」,lapply(df2,deyo))能夠爲每個子幀生成輸出。但是如果我只想要每個輸出中的矢量,我可以做什麼? – Wendy

+0

我不得不看看這個函數來確認,但是如果函數返回一個向量和兩個數據框,當你在數據框列表中調用lapply(deyo)時,輸出列表應該是一個向量列表和數據框架,你可能只需通過索引使用正常列表切片來拉向量。 – TomR