问:数据帧中零长度字符串的levels()和unique()之间的区别

时间:2016-08-19 14:16:37

标签: r

如果数据框中的列包含零长度字符串,则将其传递给levels()函数将返回零长度字符串。但是,unique()不会。这对我来说似乎是违反直觉的,而且我找不到任何解释这一点的文档。有谁知道为什么会这样?

示例:

d <- data.frame( col1 = c("", 'a', 'b'))  # Contains "".

调用unique():

unique(d$col1)

unique()不返回零长度字符串元素:

[1]   a b
Levels:  a b  

levels()在结果中包含“”:

levels(d$col1)
[1] ""  "a" "b"

1 个答案:

答案 0 :(得分:0)

这与打印方法有关。从文档中,unique的返回值:

  

对于矢量,x的相同类型的对象,但每个重复元素只有一个副本。没有复制任何属性(因此结果没有名称)。

事实上,您可以看到unique返回一个因素,因为col1也是一个因素:

class(unique(d$col1))
[1] "factor"

然而,levels的返回值是一个字符向量:

class(levels(d$col1))
[1] "character"

因此,unique会打印空字符串但没有双引号。另一种方法是定义不带因子列的df:

d <- data.frame(col1 = c("", 'a', 'b'), stringsAsFactors = F)

这里unique确实会返回想要的“”。当然levels仅适用于因素而且不再适用:

unique(d$col1)
[1] ""  "a" "b"