R:在使用空字符数据框进行 rbind 后,字符变成了 NA

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

所以我的问题可能非常基础。不过,我很感激任何帮助:

我正在尝试使用循环将嵌套列表解析为数据框。 为此,我首先创建了一个空数据框,其中列名和所有列都是字符:

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

现在 str(dat) 会 return 像这样:

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

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

然后使用 for 循环,我能够从嵌套列表中提取变量列表。有几个嵌套循环处理多个嵌套数据框,所以这里是简化版本:

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)))    
}

在第一个循环 (i==1) 之后,returned 数据将如下所示:

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

一切看起来都很好。然而,三个循环都完成后,我得到的是这样的:

 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>

现在我检查了 str(dat)。数据框中的列变成了因子!它显示了这样的东西: 'data.frame':3 个观测值。 6 个变量:

 $ 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

我使用 source 进行调试并确保每个循环中的每个变量都不是 NA 或 NULL。我还使用 class() 来确保每个变量都是字符类型——字符向量与字符类型数据框的结合如何将所有内容都变成因子?

请帮忙。 谢谢。

rbind 行替换为:

dat <- rbind(dat, setNames(as.list(c(a,b,c,d,e,f)), names(dat)), stringsAsFactors = FALSE)

这是没有输出的完整脚本:

> dat<-data.frame(a=character(0), b=character(0), c=character(0), d=character(0), e=character(0), f=character(0),stringsAsFactors=FALSE)
> 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)),stringsAsFactors = FALSE)    
+ }
> dat
       a         b        c     d        e       f
1 sdfsaf dfadasfsd fdsfsadf dfads sfdsfdsf dfsfsdf
2 sdfsaf dfadasfsd fdsfsadf dfads sfdsfdsf dfsfsdf
3 sdfsaf dfadasfsd fdsfsadf dfads sfdsfdsf dfsfsdf

我在 R 3.3.1 和 R 的开发版本下都得到了这个答案。

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"