[R] About populating a dataframe in a loop

Rui Barradas ruipbarradas at sapo.pt
Sat Jan 7 13:26:59 CET 2017


Hello,

I believe you should follow Jeremiah's sugestion to first read all csv 
files into a list and then rbind them.
Something like the following.

file_list <- list.files(pattern = "*.csv")
df_list <- lapply(file_list, read.csv)
result <- do.call(rbind, df_list)

Hope this helps,

Rui Barradas

Em 07-01-2017 06:51, lily li escreveu:
> Thanks, Richard. But if the data cannot fill the constructed data frame,
> will there be NA values?
>
>
> On Fri, Jan 6, 2017 at 10:07 PM, Richard M. Heiberger <rmh at temple.edu
> <mailto:rmh at temple.edu>> wrote:
>
>     Incrementally increasing the size of an array is not efficient in R.
>     The recommended technique is to allocate as much space as you will
>     need, and then fill it.
>
>      > system.time({tmp <- 1:5 ; for (i in 1:1000) tmp <- rbind(tmp, 1:5)})
>         user  system elapsed
>        0.011   0.000   0.011
>      > dim(tmp)
>     [1] 1001    5
>      > system.time({tmp <- matrix(NA, 1001, 5); for (i in 1:1001)
>     tmp[i,] <- 1:5})
>         user  system elapsed
>        0.001   0.000   0.001
>      > dim(tmp)
>     [1] 1001    5
>
>     On Fri, Jan 6, 2017 at 11:46 PM, lily li <chocold12 at gmail.com
>     <mailto:chocold12 at gmail.com>> wrote:
>      > Hi Rui,
>      >
>      > Thanks for your reply. Yes, when I tried to rbind two dataframes,
>     it works.
>      > However, if there are more than 50, it got stuck for hours. When
>     I tried to
>      > terminate the process and open the csv file separately, it has
>     only one
>      > data frame. What is the problem? Thanks.
>      >
>      >
>      > On Fri, Jan 6, 2017 at 11:12 AM, Rui Barradas
>     <ruipbarradas at sapo.pt <mailto:ruipbarradas at sapo.pt>> wrote:
>      >
>      >> Hello,
>      >>
>      >> Works with me:
>      >>
>      >> set.seed(6574)
>      >>
>      >> pre.mat = data.frame()
>      >> for(i in 1:10){
>      >>     mat.temp = data.frame(x = rnorm(5), A = sample(LETTERS, 5,
>     TRUE))
>      >>     pre.mat = rbind(pre.mat, mat.temp)
>      >> }
>      >>
>      >> nrow(pre.mat)  # should be 50
>      >>
>      >>
>      >> Can you give us an example that doesn't work?
>      >>
>      >> Rui Barradas
>      >>
>      >>
>      >> Em 06-01-2017 18:00, lily li escreveu:
>      >>
>      >>> Hi R users,
>      >>>
>      >>> I have a question about filling a dataframe in R using a for loop.
>      >>>
>      >>> I created an empty dataframe first and then filled it, using
>     the code:
>      >>> pre.mat = data.frame()
>      >>> for(i in 1:10){
>      >>>      mat.temp = data.frame(some values filled in)
>      >>>      pre.mat = rbind(pre.mat, mat.temp)
>      >>> }
>      >>> However, the resulted dataframe has not all the rows that I
>     desired for.
>      >>> What is the problem and how to solve it? Thanks.
>      >>>
>      >>>         [[alternative HTML version deleted]]
>      >>>
>      >>> ______________________________________________
>      >>> R-help at r-project.org <mailto:R-help at r-project.org> mailing list
>     -- To UNSUBSCRIBE and more, see
>      >>> https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>      >>> PLEASE do read the posting guide http://www.R-project.org/posti
>      >>> ng-guide.html
>      >>> and provide commented, minimal, self-contained, reproducible code.
>      >>>
>      >>>
>      >
>      >         [[alternative HTML version deleted]]
>      >
>      > ______________________________________________
>      > R-help at r-project.org <mailto:R-help at r-project.org> mailing list
>     -- To UNSUBSCRIBE and more, see
>      > https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>      > PLEASE do read the posting guide
>     http://www.R-project.org/posting-guide.html
>     <http://www.R-project.org/posting-guide.html>
>      > and provide commented, minimal, self-contained, reproducible code.
>
>



More information about the R-help mailing list