The idea of this paper to compare the performance of the conventional aprroaches to handle rows and columns (dataframes) vs. faster ones.

rbind only

rm(list=ls())
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842438 45.0    2613377 139.6   9493837  507.1
Vcells 5475159 41.8   18260854 139.4 255390158 1948.5
df_size<-10000
df<-data.frame(x=numeric(0),y=numeric(0),z=numeric(0))
#to build a dataframe
start<-proc.time()  
i<-1
    for(i in 1:df_size){
      df<-rbind(df,c(1043,1004545,78788))
      
    }
print(proc.time()-start)
   user  system elapsed 
   9.64    0.01   10.96 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842453 45.0    2613377 139.6   9493837  507.1
Vcells 5475184 41.8   18260854 139.4 255390158 1948.5

rbind+do.call

df<-data.frame(x=numeric(0),y=numeric(0),z=numeric(0))
#to build a dataframe
start<-proc.time()  
i<-1
for(i in 1:df_size){
  df<-do.call("rbind",list(df,c(1043,1004545,78788)))
  #print(i)
}
print(proc.time()-start)
   user  system elapsed 
   9.74    0.01   10.93 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842453 45.0    2613377 139.6   9493837  507.1
Vcells 5475184 41.8   18260854 139.4 255390158 1948.5

rbind + dataframe size - bad

df<-data.frame(x=numeric(df_size),y=numeric(df_size),z=numeric(df_size))
#to build a dataframe
start<-proc.time()  
  i<-1
  for(i in 1:df_size){
    df<-rbind(df,c(1043,1004545,78788))
    #print(i)
  }
print(proc.time()-start)
   user  system elapsed 
  29.04    0.01   30.73 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842453 45.0    2613377 139.6   9493837  507.1
Vcells 5475184 41.8   18260854 139.4 255390158 1948.5

rbind + partial dataframe

df<-data.frame(x=numeric(0),y=numeric(0),z=numeric(0))
#to build a dataframe
start<-proc.time()  
i<-1
for(i in 1:df_size){
  df<-rbind(df,data.frame(x=1043,y=1004545,z=078788))
  #print(i)
}
print(proc.time()-start)
   user  system elapsed 
  17.40    0.02   19.57 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842453 45.0    2613377 139.6   9493837  507.1
Vcells 5475184 41.8   18260854 139.4 255390158 1948.5

rbind + dataframe size + indexing

df<-data.frame(x=numeric(df_size),y=numeric(df_size),z=numeric(df_size))
#to build a dataframe
start<-proc.time()  
i<-1
for(i in 1:df_size){
  #df<-rbind(df,c(1043,1004545,78788))
  df[i,1]<-1043
  df[i,2]<-1004545
  df[i,3]<-78788
  
  #print(i)
}
print(proc.time()-start)
   user  system elapsed 
   3.48    0.02    6.21 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842453 45.0    2613377 139.6   9493837  507.1
Vcells 5475184 41.8   18260854 139.4 255390158 1948.5

rbind + indexing

df<-data.frame(x=numeric(0),y=numeric(0),z=numeric(0))
start<-proc.time()  
i<-1
for(i in 1:df_size){
  #df<-rbind(df,c(1043,1004545,78788))
  df[i,1]<-1043
  df[i,2]<-1004545
  df[i,3]<-78788
  #print(i)
}
print(proc.time()-start)
   user  system elapsed 
   7.97    0.02   13.56 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842453 45.0    2613377 139.6   9493837  507.1
Vcells 5475184 41.8   18260854 139.4 255390158 1948.5

using data table’s rbindlist each iteration

The example is based upon here

library(data.table)
df<-data.frame(x=numeric(0),y=numeric(0),z=numeric(0))
df_row<-data.frame(x=1043,y=1004545,z=078788)
start<-proc.time()  
i<-1
  for(i in 1:df_size){
    df <- rbindlist(list(df,df_row))
  }
df<-as.data.frame(df)
print(proc.time()-start)
   user  system elapsed 
   2.94    0.01    4.37 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  843006 45.1    2613377 139.6   9493837  507.1
Vcells 5699949 43.5   18260854 139.4 255390158 1948.5

using data table’s rbindlist and lapply to process all data

The example is based upon here

df_row<-data.frame(x=1043,y=1004545,z=078788)
start<-proc.time()  
df<-data.frame(rbindlist(lapply(1:df_size,function(x) df_row)))
df<-as.data.frame(df)
print(proc.time()-start)
   user  system elapsed 
   0.02    0.02    0.16 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842476 45.0    2613377 139.6   9493837  507.1
Vcells 5479363 41.9   18260854 139.4 255390158 1948.5

rbind.fill from plyr package

library(plyr)
df<-data.frame(x=numeric(0),y=numeric(0),z=numeric(0))
#to build a dataframe
start<-proc.time()  
i<-1
for(i in 1:df_size){
  df<-rbind.fill(df,data.frame(x=1043,y=1004545,z=078788))
  #print(i)
}
print(proc.time()-start)
   user  system elapsed 
  20.61    0.06   26.91 
rm(df)
gc()
          used (Mb) gc trigger  (Mb)  max used   (Mb)
Ncells  842463 45.0    2613377 139.6   9493837  507.1
Vcells 5475196 41.8   18260854 139.4 255390158 1948.5
LS0tDQp0aXRsZTogIlJvdyBhbmQgY29sdW1uIG1hbmlwdWxhdGlvbiBpbiBSIChkYXRhZnJhbWVzKSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KYXV0aG9yOiBEZW15ZCBEenl1YmFuDQpkYXRlOiAxNi8xMi8yMDE2DQotLS0NCg0KVGhlIGlkZWEgb2YgdGhpcyBwYXBlciB0byBjb21wYXJlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY29udmVudGlvbmFsIGFwcnJvYWNoZXMgdG8gaGFuZGxlIHJvd3MgYW5kIGNvbHVtbnMgKGRhdGFmcmFtZXMpIHZzLiBmYXN0ZXIgb25lcy4gIA0KDQojIyMjICpyYmluZCBvbmx5Kg0KDQpgYGB7cn0NCnJtKGxpc3Q9bHMoKSkNCmdjKCkNCmBgYA0KDQpgYGB7cn0NCmRmX3NpemU8LTEwMDAwDQpkZjwtZGF0YS5mcmFtZSh4PW51bWVyaWMoMCkseT1udW1lcmljKDApLHo9bnVtZXJpYygwKSkNCg0KI3RvIGJ1aWxkIGEgZGF0YWZyYW1lDQpzdGFydDwtcHJvYy50aW1lKCkgIA0KaTwtMQ0KICAgIGZvcihpIGluIDE6ZGZfc2l6ZSl7DQogICAgICBkZjwtcmJpbmQoZGYsYygxMDQzLDEwMDQ1NDUsNzg3ODgpKQ0KICAgICAgDQogICAgfQ0KcHJpbnQocHJvYy50aW1lKCktc3RhcnQpDQoNCnJtKGRmKQ0KZ2MoKQ0KDQpgYGANCg0KIyMjIyByYmluZCtkby5jYWxsIA0KDQpgYGB7cn0NCmRmPC1kYXRhLmZyYW1lKHg9bnVtZXJpYygwKSx5PW51bWVyaWMoMCksej1udW1lcmljKDApKQ0KDQojdG8gYnVpbGQgYSBkYXRhZnJhbWUNCnN0YXJ0PC1wcm9jLnRpbWUoKSAgDQppPC0xDQpmb3IoaSBpbiAxOmRmX3NpemUpew0KICBkZjwtZG8uY2FsbCgicmJpbmQiLGxpc3QoZGYsYygxMDQzLDEwMDQ1NDUsNzg3ODgpKSkNCiAgI3ByaW50KGkpDQp9DQpwcmludChwcm9jLnRpbWUoKS1zdGFydCkNCg0Kcm0oZGYpDQpnYygpDQoNCmBgYA0KDQojIyMjIHJiaW5kICsgZGF0YWZyYW1lIHNpemUgLSBiYWQNCg0KYGBge3J9DQpkZjwtZGF0YS5mcmFtZSh4PW51bWVyaWMoZGZfc2l6ZSkseT1udW1lcmljKGRmX3NpemUpLHo9bnVtZXJpYyhkZl9zaXplKSkNCiN0byBidWlsZCBhIGRhdGFmcmFtZQ0Kc3RhcnQ8LXByb2MudGltZSgpICANCiAgaTwtMQ0KICBmb3IoaSBpbiAxOmRmX3NpemUpew0KICAgIGRmPC1yYmluZChkZixjKDEwNDMsMTAwNDU0NSw3ODc4OCkpDQogICAgI3ByaW50KGkpDQogIH0NCnByaW50KHByb2MudGltZSgpLXN0YXJ0KQ0Kcm0oZGYpDQpnYygpDQoNCmBgYA0KDQoNCiMjIyMgcmJpbmQgKyBwYXJ0aWFsIGRhdGFmcmFtZQ0KYGBge3J9DQpkZjwtZGF0YS5mcmFtZSh4PW51bWVyaWMoMCkseT1udW1lcmljKDApLHo9bnVtZXJpYygwKSkNCg0KI3RvIGJ1aWxkIGEgZGF0YWZyYW1lDQpzdGFydDwtcHJvYy50aW1lKCkgIA0KaTwtMQ0KZm9yKGkgaW4gMTpkZl9zaXplKXsNCiAgZGY8LXJiaW5kKGRmLGRhdGEuZnJhbWUoeD0xMDQzLHk9MTAwNDU0NSx6PTA3ODc4OCkpDQogICNwcmludChpKQ0KfQ0KcHJpbnQocHJvYy50aW1lKCktc3RhcnQpDQoNCnJtKGRmKQ0KZ2MoKQ0KDQpgYGANCg0KIyMjIyByYmluZCArIGRhdGFmcmFtZSBzaXplICsgaW5kZXhpbmcNCg0KYGBge3J9DQpkZjwtZGF0YS5mcmFtZSh4PW51bWVyaWMoZGZfc2l6ZSkseT1udW1lcmljKGRmX3NpemUpLHo9bnVtZXJpYyhkZl9zaXplKSkNCg0KI3RvIGJ1aWxkIGEgZGF0YWZyYW1lDQpzdGFydDwtcHJvYy50aW1lKCkgIA0KaTwtMQ0KZm9yKGkgaW4gMTpkZl9zaXplKXsNCiAgI2RmPC1yYmluZChkZixjKDEwNDMsMTAwNDU0NSw3ODc4OCkpDQogIGRmW2ksMV08LTEwNDMNCiAgZGZbaSwyXTwtMTAwNDU0NQ0KICBkZltpLDNdPC03ODc4OA0KICANCiAgI3ByaW50KGkpDQp9DQpwcmludChwcm9jLnRpbWUoKS1zdGFydCkNCnJtKGRmKQ0KZ2MoKQ0KDQpgYGANCg0KIyMjIyByYmluZCArIGluZGV4aW5nDQoNCmBgYHtyfQ0KZGY8LWRhdGEuZnJhbWUoeD1udW1lcmljKDApLHk9bnVtZXJpYygwKSx6PW51bWVyaWMoMCkpDQoNCnN0YXJ0PC1wcm9jLnRpbWUoKSAgDQppPC0xDQpmb3IoaSBpbiAxOmRmX3NpemUpew0KICAjZGY8LXJiaW5kKGRmLGMoMTA0MywxMDA0NTQ1LDc4Nzg4KSkNCiAgZGZbaSwxXTwtMTA0Mw0KICBkZltpLDJdPC0xMDA0NTQ1DQogIGRmW2ksM108LTc4Nzg4DQogICNwcmludChpKQ0KfQ0KcHJpbnQocHJvYy50aW1lKCktc3RhcnQpDQpybShkZikNCmdjKCkNCg0KYGBgDQoNCiMjIyMgdXNpbmcgZGF0YSB0YWJsZSdzIHJiaW5kbGlzdCBlYWNoIGl0ZXJhdGlvbg0KVGhlIGV4YW1wbGUgaXMgYmFzZWQgdXBvbiBbaGVyZV0oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTY5NzcwMC9ob3ctdG8tc3BlZWQtdXAtcmJpbmQpDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KGRhdGEudGFibGUpDQoNCmRmPC1kYXRhLmZyYW1lKHg9bnVtZXJpYygwKSx5PW51bWVyaWMoMCksej1udW1lcmljKDApKQ0KZGZfcm93PC1kYXRhLmZyYW1lKHg9MTA0Myx5PTEwMDQ1NDUsej0wNzg3ODgpDQpzdGFydDwtcHJvYy50aW1lKCkgIA0KaTwtMQ0KICBmb3IoaSBpbiAxOmRmX3NpemUpew0KICAgIGRmIDwtIHJiaW5kbGlzdChsaXN0KGRmLGRmX3JvdykpDQogIH0NCg0KZGY8LWFzLmRhdGEuZnJhbWUoZGYpDQpwcmludChwcm9jLnRpbWUoKS1zdGFydCkNCnJtKGRmKQ0KZ2MoKQ0KDQpgYGANCg0KIyMjIyB1c2luZyBkYXRhIHRhYmxlJ3MgcmJpbmRsaXN0IGFuZCBsYXBwbHkgdG8gcHJvY2VzcyBhbGwgZGF0YQ0KVGhlIGV4YW1wbGUgaXMgYmFzZWQgdXBvbiBbaGVyZV0oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTY5NzcwMC9ob3ctdG8tc3BlZWQtdXAtcmJpbmQpDQoNCmBgYHtyfQ0KZGZfcm93PC1kYXRhLmZyYW1lKHg9MTA0Myx5PTEwMDQ1NDUsej0wNzg3ODgpDQpzdGFydDwtcHJvYy50aW1lKCkgIA0KDQpkZjwtZGF0YS5mcmFtZShyYmluZGxpc3QobGFwcGx5KDE6ZGZfc2l6ZSxmdW5jdGlvbih4KSBkZl9yb3cpKSkNCg0KZGY8LWFzLmRhdGEuZnJhbWUoZGYpDQpwcmludChwcm9jLnRpbWUoKS1zdGFydCkNCnJtKGRmKQ0KZ2MoKQ0KDQpgYGANCg0KIyMjIyByYmluZC5maWxsIGZyb20gcGx5ciBwYWNrYWdlDQoNCmBgYHtyfQ0KbGlicmFyeShwbHlyKQ0KDQpkZjwtZGF0YS5mcmFtZSh4PW51bWVyaWMoMCkseT1udW1lcmljKDApLHo9bnVtZXJpYygwKSkNCiN0byBidWlsZCBhIGRhdGFmcmFtZQ0KDQpzdGFydDwtcHJvYy50aW1lKCkgIA0KaTwtMQ0KZm9yKGkgaW4gMTpkZl9zaXplKXsNCiAgZGY8LXJiaW5kLmZpbGwoZGYsZGF0YS5mcmFtZSh4PTEwNDMseT0xMDA0NTQ1LHo9MDc4Nzg4KSkNCiAgI3ByaW50KGkpDQp9DQpwcmludChwcm9jLnRpbWUoKS1zdGFydCkNCg0Kcm0oZGYpDQpnYygpDQoNCmBgYA==