为何无法将因子化向量与整个数据框进行比较?
问题:因子向量与数据框/单列比较的行为差异
当尝试将普通(非因子)向量与整个数据框进行比较时,可正常得到结果;但将因子化向量与数据框比较时则会报错。示例代码如下:
df <- data.frame( name = c('Abdul', 'Wahhab', 'Zahid', 'Hussain', 'Rana') ) names <- c('Abdul', 'Wahhab', 'Zahid', 'Hussain', 'Rana')
执行names == df可得到全TRUE的结果;但将向量因子化后执行factored_names <- factor(names)和factored_names == df,会报错:
Warning: Incompatible methods ("Ops.factor", "Ops.data.frame") for "==" Error in factored_names == df (to_ask.R#10): comparison of these types is not implemented
已知因子化向量以整数形式存储,但其与数据框的单列(无论是否为因子类型)比较时却可正常运行,如factored_names == df$name能得到全TRUE结果。请问为何因子化向量无法与整个数据框比较,却可与单列正常比较?
原因解析
这本质是R的运算符方法分派机制和数据结构处理逻辑导致的:
普通向量与数据框比较的逻辑:
当用普通字符向量和数据框执行==时,R会自动将单列数据框降维为同类型的向量(数据框本质是向量的列表,单列时会被简化),此时实际执行的是两个字符向量的比较,因此能正常返回全TRUE的结果。因子向量与数据框比较报错的原因:
因子属于factor特殊类型,R的运算符会优先调用针对因子的Ops.factor方法;而数据框对应的运算符方法是Ops.data.frame。R并未实现这两种类型之间的==运算逻辑,因此会抛出“方法不兼容”的错误。因子向量与单列比较正常的逻辑:
提取df$name得到的是独立向量(字符型或因子型),此时比较的是两个向量:- 如果是因子和字符向量比较,R会自动将字符向量转换为与目标因子具有相同水平的因子,再匹配底层整数编码;
- 如果是两个因子比较,则直接对比它们的底层整数编码和水平定义,因此都能正常返回正确结果。
内容的提问来源于stack exchange,提问作者Wahab Khaddim
相关产品推荐
相关产品推荐

