在R中按行将一个大数据帧拆分为多个数据帧

时间:2020-08-25 21:02:06

标签: r dataframe split subset

我有一个大型数据框,其中有超过40万个变量的100万条记录,我希望通过循环进行值更新以防止故障,并且文件大小每次都不同。我想将超过1m的行分成n个较小的集合,每个集合都有一个新的数据框名称,例如以1,2,...,n,newdf1,newdf2,newdf3,...结尾。 R中的split函数仅分割向量,但它仍在该数据帧中,而不创建该数据帧的多个子集,而我需要将其保留在40个变量中。我没有要按列拆分的任何值,我只想按行号拆分。

2 个答案:

答案 0 :(得分:0)

在此示例中,我们生成一个具有一百万行的数据帧,将其分为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中删除原始数据帧。

答案 1 :(得分:0)

我没有看到带有某些样本数据的最小可重复性示例,我认为我对您要完成的目标有所了解。假设您有一个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