R语言赋值时因子转为整数:如何保留因子原始信息?
解决因子赋值后转为整数的问题
这个问题其实是因为你新创建的frame2(也就是Matching_list)的列默认是数值型(numeric),而R里的因子本质是带有标签的整数向量——当你把因子赋值给数值型列时,R会自动提取因子底层的整数编码,而不是保留它的标签信息。下面给你几种实用的解决办法:
方法1:创建frame2时直接指定目标列为因子类型
在初始化数据框的时候,就把要接收因子的列(比如Pol_Centre)设置为因子,并且和frame1$fact使用相同的水平,这样赋值时就能直接保留原始标签:
# 先获取frame1中fact列的因子水平 fact_levels <- levels(frame1$fact) # 创建frame2时指定对应列的类型为因子 frame2 <- setNames( data.frame( ProIDS = character(nrow(frame1)), # 根据你的需求设置类型,这里用字符型示例 Pol_Centre = factor(character(nrow(frame1)), levels = fact_levels), Dist = numeric(nrow(frame1)), stringsAsFactors = FALSE # 避免自动把字符型转因子(可选,看你的需求) ), c("ProIDS", "Pol_Centre", "Dist") ) # 现在赋值就会保留因子的原始信息 frame2$Pol_Centre <- frame1$fact
方法2:给已创建的frame2修改列类型后再赋值
如果已经创建了frame2,不想重新初始化,可以先把目标列转换为和frame1$fact同水平的因子,再进行赋值:
# 将frame2的Pol_Centre列转换为因子,复用frame1$fact的水平 frame2$Pol_Centre <- factor(frame2$Pol_Centre, levels = levels(frame1$fact)) # 现在赋值即可保留原始标签 frame2$Pol_Centre <- frame1$fact
方法3:用tidyverse工具更简洁处理
如果你习惯用dplyr这类tidyverse包,可以更直观地创建和赋值,它会自动保留因子类型:
library(dplyr) # 直接创建包含因子列的frame2 frame2 <- tibble( ProIDS = character(nrow(frame1)), Pol_Centre = frame1$fact, # 直接传入因子,自动保留类型 Dist = numeric(nrow(frame1)) ) %>% setNames(c("ProIDS", "Pol_Centre", "Dist"))
核心思路就是:确保接收因子的列本身是因子类型,并且和源因子有一致的水平,这样R就不会把因子转成底层的整数啦。
内容的提问来源于stack exchange,提问作者TAMEZA Bertrand Borel
相关产品推荐
相关产品推荐

