[英]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.