Search code examples
rloopsdataframerbindr-factor

R: characters turned into NA after rbind'ing with an empty character data frame


so my question might be very basic. I appreciate any help though:

I am trying to parse a nested list into a data frame using loops. To do this, I first created an empty data frame, with column names and all columns as characters:

dat<-data.frame(a=character(0), b=character(0), c=character(0), d=character(0), e=character(0), f=character(0),stringsAsFactors=FALSE)

Right now str(dat) would return something like this:

'data.frame':   0 obs. of  6 variables:

 $ a: chr 
 $ b : chr 
 $ c: chr 
 $ d: chr 
 $ e: chr 
 $ f: chr 

Then using for loops, I was able to extract list of variables from the nested list. There are several nested loops dealing with several nested data frames, so here is the simplified version:

for(i in 1:3){
  a<-"sdfsaf"
  b<-"dfadasfsd"
  c<-"fdsfsadf"
  d<-"dfads"
  e<-"sfdsfdsf"
  f<-"dfsfsdf"
  dat<-rbind(dat,setNames(as.list(c(a,b,c,d,e,f)),names(dat)))    
}

After the first loop (i==1), the returned dat will look like this:

     a            b            c            d          e            f
2  sdfsaf      dfadasfsd    fdsfsadf        dfads     sfdsfdsf      dfsfsdf

Everything looks good. However, after all three loops completed, what I got is like this:

 a            b            c            d          e            f
2  sdfsaf      dfadasfsd    fdsfsadf        dfads     sfdsfdsf      dfsfsdf
3 <NA>        <NA>       <NA>             <NA>        <NA>          <NA>
4  <NA>        <NA>       <NA>              <NA>      <NA>           <NA>

Now I checked str(dat). The columns in the data frame changed into factors! It shows something like this: 'data.frame': 3 obs. of 6 variables:

 $ a: Factor w/ 1 level "sdfsaf": 1 NA NA 
 $ b : Factor w/ 1 level "dfadasfsd": 1 NA NA
 $ c: Factor w/ 1 level "fdsfsadf": 1 NA NA
 $ d: Factor w/ 1 level "dfads": 1 NA NA
 $ e: Factor w/ 1 level "sfdsfdsf": 1 NA NA
 $ f: Factor w/ 1 level "dfsfsdf": 1 NA NA

I used source to debug and made sure that each variable in each loop was not NA or NULL. I also used class() to make sure each variable is character type - how could a vector of characters combine with an character type data frame would change everything into factors?

Please help. Thanks.


Solution

  • for(i in 1:3){
      dat<-rbind(dat,setNames(as.list(c(a,b,c,d,e,f)),names(dat)))
    
    }
    
    dat[,1:6] <-apply(dat[,1:6],2, as.character)
    
    str(dat)
    'data.frame':   3 obs. of  6 variables:
      $ a: chr  "sdfsaf" "sdfsaf" "sdfsaf"
    $ b: chr  "dfadasfsd" "dfadasfsd" "dfadasfsd"
    $ c: chr  "fdsfsadf" "fdsfsadf" "fdsfsadf"
    $ d: chr  "dfads" "dfads" "dfads"
    $ e: chr  "sfdsfdsf" "sfdsfdsf" "sfdsfdsf"
    $ f: chr  "dfsfsdf" "dfsfsdf" "dfsfsdf"