我有一些与不同类的行为/属性相关的问题。
当尝试使用类字符列创建数据框时,它会创建一个带有因子的数据框。
df1 <- data.frame(var1= character())
str(df1)
与
相同df2 <- data.frame(var1= factor())
str(df2)
为什么第一种情况下的课程不是chr
?
当尝试添加时间变量时,会发生错误并与例如字符组合。 这有效:
df3 <- data.frame( var1=as.POSIXct(0,origin="2012-12-31"))
str(df3)
这不是:
df4 <- data.frame(var1= character(0),var2=as.POSIXct(0,origin="2012-12-31"))
str(df4)
但这些确实:
df4.1 <- data.frame(var1= character(1),var2=as.POSIXct(0,origin="2012-12-31"))
str(df4.1)
df4.2 <- data.frame(var1= factor(0),var2=as.POSIXct(0,origin="2012-12-31"))
str(df4.2)
似乎该行为与缺少具有字符,数字和整数类的级别或格式(与因子或日期类一起出现)有关。
答案 0 :(得分:3)
对于您的第一个问题,创建stringsAsFactors = TRUE
时默认为data.frame
。改变它会得到你期望的结果。
> df1a <- data.frame(var1= character())
> str(df1a)
'data.frame': 0 obs. of 1 variable:
$ var1: Factor w/ 0 levels:
> df1b <- data.frame(var1= character(), stringsAsFactors=FALSE)
> str(df1b)
'data.frame': 0 obs. of 1 variable:
$ var1: chr
对于您的第二个,character(0)
和factor(0)
是不同的事情。 character()
与character(0)
相同,但factor()
与factor(0)
试试这个:
> a <- character()
> b <- character(0)
> A <- factor()
> B <- factor(0)
> sapply(list(a=a, b=b, A=A, B=B), length)
a b A B
0 0 0 1
具体而言,从?character
开始,使用形式为:
character(length = 0) ## Just the one argument
来自?factor
,使用形式为:
factor(x = character(), levels, labels = levels,
exclude = NA, ordered = is.ordered(x))
其中第一项是您将用于创建因子的值。
答案 1 :(得分:2)
阅读help(data.frame)
。
df1
:此行为由stringsAsFactors
参数控制。
df4
:var1
长度为0,长度为var2
1. data.frame中的所有列必须具有相同的长度。通常情况下,较短的向量将被回收,但对于长度为0的向量,这是不可能的。
df4.2
:factor(0)
不返回长度为0的因子变量,而是返回值为0的因子。因此两列的长度相等。