R语言中向factor向量追加元素为何转为字符类型?
为什么用
append()给因子向量加元素会变成字符类型? 首先得搞懂R里因子的本质:因子看起来是字符串标签,但底层其实是整数向量,每个整数对应一个预定义的水平(levels)。你看到typeof(size_order)返回integer就是这个道理——那些"small""medium"只是显示用的“外号”,真正存在内存里的是1、2、3这些数字。
再看append()函数的逻辑:它的作用就是把两个东西拼在一起,但前提是得把它们转成同一种类型。当你把一个因子(底层是整数)和一个字符串"small"拼的时候,R得找个能同时容纳两者的类型,那只能是字符型。于是就出现了这种情况:
- 原因子里的整数底层被转成了字符串(1→"1",2→"2")
- 你追加的"small"本身就是字符串,直接保留
拼完自然就成了字符向量。
对了,你代码里有个小笔误:size order应该是size_order,而且输出里的Levels显示有"huge",但你定义的时候只指定了三个水平,估计是手滑写错了。
想保持因子类型?这么做才对
别用append(),试试这两种方法:
- 把要追加的元素先转成和原因子同水平的因子,再用
c()拼接:
size_order <- factor(c("small", "medium", "large", "medium", "small", "small"), levels = c("small", "medium", "large")) # 先把追加的"small"转成同水平的因子 size_order <- c(size_order, factor("small", levels = levels(size_order))) size_order #> [1] small medium large medium small small small #> Levels: small medium large typeof(size_order) #> [1] "integer"
- 先把因子转回普通字符向量,拼接后再重新转成因子:
size_order <- factor(c("small", "medium", "large", "medium", "small", "small"), levels = c("small", "medium", "large")) size_order <- factor(c(as.character(size_order), "small"), levels = levels(size_order)) size_order #> [1] small medium large medium small small small #> Levels: small medium large typeof(size_order) #> [1] "integer"
说白了就是:append()没考虑因子的特殊结构,只做了最基础的类型兼容拼接。要维持因子类型,得自己处理类型匹配,要么给新元素套上相同的因子水平,要么先拆成字符再重新打包成因子。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

