簡體   English   中英

R中按行將大數據幀拆分為多個數據幀

[英]Split a large dataframe into multiple dataframes by row in R

我有一個包含超過 1m 條記錄的大型數據框,其中包含超過 40 個變量,我想通過循環來運行值更新以防止出現故障,並且文件的大小每次都不同。 我想將超過 1m 行分成 n 個較小的集合,每個集合都有一個新的數據幀名稱,例如以 1,2,...,n, newdf1, newdf2, newdf3,... 結尾。 R 中的 split 函數僅拆分向量,但它仍在該數據幀中,而不是創建數據幀的多個子集,我需要在 40 個變量中保留數據類型。 我沒有要按列拆分的任何值,我只想按行號按順序拆分。

這是一個示例,我們生成一個包含 100 萬行的數據框,將其分成 20 組,在結果列表中命名數據框,並通過使用$運算符提取列表中的第一個數據框對它運行summary()按名字。

set.seed(90125)
df <- as.data.frame(matrix(rnorm(40000000,mean = 25,sd=5),ncol=40))
# make group number start with 1, as remainders
# vary from 0 - 19
df$group <- 1:1000000 %% 20 + 1
dfList <- split(df,df$group)

此時,內存中有兩個數據副本:原始數據框df和第二個副本,該副本被拆分為列表dfList 20 個不同數據框。

我們可以用length()函數來證明這一點:

> length(dfList)
[1] 20

每個數據框有 50,000 個觀察值,我們可以用nrow()函數來演示:

> nrow(dfList[[1]])
[1] 50000

我們可以使用names()paste0()的組合為數據框指定名稱。

# add names to the list and print the names
names(dfList) <- paste0("data",1:20)
names(dfList)
> names(dfList)
 [1] "data1"  "data2"  "data3"  "data4"  "data5"  "data6"  "data7"  "data8" 
 [9] "data9"  "data10" "data11" "data12" "data13" "data14" "data15" "data16"
[17] "data17" "data18" "data19" "data20"

一旦數據框被命名,就可以通過提取操作符的$形式從列表中訪問它們。 我們將生成第一個數據框的摘要,按名稱訪問它。

summary(dfList$data1[1:5])

...和輸出:

> summary(dfList$data1[1:5])
       V1                V2               V3              V4        
 Min.   :-0.7251   Min.   : 2.481   Min.   : 3.02   Min.   : 3.173  
 1st Qu.:21.5919   1st Qu.:21.603   1st Qu.:21.57   1st Qu.:21.526  
 Median :24.9990   Median :24.982   Median :24.97   Median :24.914  
 Mean   :24.9968   Mean   :24.978   Mean   :24.97   Mean   :24.931  
 3rd Qu.:28.3971   3rd Qu.:28.330   3rd Qu.:28.32   3rd Qu.:28.357  
 Max.   :45.7101   Max.   :44.730   Max.   :48.03   Max.   :45.506  
       V5        
 Min.   : 2.427  
 1st Qu.:21.595  
 Median :25.010  
 Mean   :24.997  
 3rd Qu.:28.406  
 Max.   :44.199  
> 

注意:原始數據幀大約消耗 312.8Mb,因此執行split()函數后,兩個數據副本將消耗大約 625.6Mb 的 RAM。 如有必要,可以使用rm()函數從 RAM 中刪除原始數據幀。

在沒有看到帶有一些示例數據的最低限度可重復示例的情況下,我想我知道您要完成的任務。 假設您有一個 10000 行的數據集,並且想要將您的數據拆分為每個 100 行的單獨數據框。 您可以根據您希望這些較小數據框的長度,將較大的數據框子集划分為一系列較小的數據框。


####  Some dummy data here ####
colA <- rep(c("X1", "X2", "X3", "X4", "X5"), 2000)
colB <- rnorm(n = 10000, mean = 3, sd = 0.25)
colC <- rnorm(n = 10000, mean = 1, sd = 1)

df <- as.data.frame(cbind(colA, colB, colC), stringsAsFactors = FALSE)

#### Create an empty list to be filled with your subset data frames ####
dataList <- list()

#### Since it's 10000 rows total, and you want 100 smaller data frames, ####
#### create an iterator variable that you can reference for subsetting. ####
listIterator <- seq(0,99,1)

for(i in listIterator){
  dataList[[i+1]] <- df[c((1+(100*i)):(100+(100*i))),]  
}

dataList[1]
dataList[2]

然后,您可以將數據框列表子集到您將在特定時間使用的任何數據框。 . .

df1 <- dataList[1]

或引用每個中的特定列

dataList[[1]]$colA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM