所以我的问题可能非常基础。我很感激任何帮助:
我试图使用循环将嵌套列表解析为数据框。 为此,我首先创建了一个空数据框,其中列名和所有列都是字符:
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()来确保每个变量都是字符类型 - 字符向量如何与字符类型数据框组合会如何将所有内容更改为因子?
请帮忙。 谢谢。
答案 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的开发版本中得到了这个答案。