R:在用空字符数据帧进行rbind后,字符变为NA

时间:2016-10-22 03:14:14

标签: r loops dataframe rbind r-factor

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

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

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)将返回如下内容:

'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)之后,返回的数据将如下所示:

     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()来确保每个变量都是字符类型 - 字符向量如何与字符类型数据框组合会如何将所有内容更改为因子?

请帮忙。 谢谢。

2 个答案:

答案 0 :(得分:1)

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"

答案 1 :(得分:0)

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的开发版本中得到了这个答案。