0

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

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

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)

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

4

2 回答 2

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

而 from ?factor,用法是:

factor(x = character(), levels, labels = levels,
       exclude = NA, ordered = is.ordered(x))

其中第一项是您将用于创建因子的值。

于 2013-03-22T09:44:55.910 回答
2

阅读help(data.frame)

df1:此行为由stringsAsFactors参数控制。

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

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

于 2013-03-22T09:44:13.597 回答