角色的起源返回一个因子并组合不同的类

时间:2013-03-22 09:36:12

标签: r

我有一些与不同类的行为/属性相关的问题。

当尝试使用类字符列创建数据框时,它会创建一个带有因子的数据框。

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)

似乎该行为与缺少具有字符,数字和整数类的级别或格式(与因子或日期类一起出现)有关。

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参数控制。

df4var1长度为0,长度为var2 1. data.frame中的所有列必须具有相同的长度。通常情况下,较短的向量将被回收,但对于长度为0的向量,这是不可能的。

df4.2factor(0)不返回长度为0的因子变量,而是返回值为0的因子。因此两列的长度相等。