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"
所以我的问题可能非常基础。不过,我很感激任何帮助:
我正在尝试使用循环将嵌套列表解析为数据框。 为此,我首先创建了一个空数据框,其中列名和所有列都是字符:
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"