从动物园对象转换时避免 (as)data.frame 将数据更改为因子

Rob*_*ert 5 r dataframe zoo

如果您有一个data.frame带有数字列的转换是没有问题的,如解释here

dtf=data.frame(matrix(rep(5,10),ncol=2))
#str(dtf)
dtfz <- zoo(dtf)
class(dtfz)
#[1] "zoo"
str(as.data.frame(dtfz))
#'data.frame':  5 obs. of  2 variables:
# $ X1: num  5 5 5 5 5
# $ X2: num  5 5 5 5 5
Run Code Online (Sandbox Code Playgroud)

但是,如果您有一个data.frame带有文本列的所有内容都将转换为因子,即使在设置时stringsAsFactors = FALSE

dtf=data.frame(matrix(rep("d",10),ncol=2),stringsAsFactors = FALSE)
#str(dtf)
dtfz <- zoo(dtf)
#class(dtfz)
#dtfz
Run Code Online (Sandbox Code Playgroud)

以下所有将字符串转换为因子:

str(as.data.frame(dtfz))
str(as.data.frame(dtfz,stringsAsFactors = FALSE))
str(data.frame(dtfz))
str(data.frame(dtfz,stringsAsFactors = FALSE))
str(as.data.frame(dtfz, check.names=FALSE, row.names=NULL,stringsAsFactors = FALSE))

#'data.frame':  5 obs. of  2 variables:
# $ X1: Factor w/ 1 level "d": 1 1 1 1 1
# $ X2: Factor w/ 1 level "d": 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

当 data.frame 有很多文本列时如何避免这种行为?

Rob*_*ert 3

我根据@thelatemail 的评论找到了解决方案。它适用于 Zoo 的实际版本(2017 年 9 月)。正如@G. Grothendieck评论道,未来版本的zoo将会考虑这一 stringsAsFactors = FALSE说法。

str(base:::as.data.frame(coredata(dtfz),stringsAsFactors = FALSE))
#'data.frame':  5 obs. of  2 variables:
# $ X1: chr  "d" "d" "d" "d" ...
# $ X2: chr  "d" "d" "d" "d" ...
Run Code Online (Sandbox Code Playgroud)