Factor转Character失败求助:mapvalues处理后列仍为Factor
为啥用plyr::mapvalues后字符列变因子了?我来帮你搞定!
嘿,这个问题我之前踩过坑,太懂这种明明转了字符还是变因子的郁闷了!咱们先搞清楚原因,再给你几个解决办法:
问题根源:plyr::mapvalues的类型转换特性
其实不是你转字符的操作没用,而是plyr::mapvalues这个函数有个“小脾气”:
- 如果你传入的
from或者to参数是因子类型(比如你的renaming数据框里的Name/Rename列是因子,而不是字符),哪怕你输入的x是纯字符向量,它也会自动把输出转换成因子。 - 有时候哪怕输入都是字符,函数内部的类型处理逻辑也可能悄悄把结果转成因子,尤其是当替换后出现了原向量里没有的新值时。
几个快速解决办法
办法1:直接把结果转成字符
最简单的方式,就是在mapvalues外面套一层as.character(),强制把输出转回字符类型:
# 执行替换并强制转字符 affrete <- as.character(plyr::mapvalues( x = unlist(list_attribute$affrete, use.names = FALSE), from = renaming$Name, to = renaming$Rename, warn_missing = FALSE # 可选:关闭缺失值警告,如果不需要的话 )) # 把替换后的值放回数据框 list_attribute$affrete <- affrete
办法2:先把renaming的列转成字符再替换
如果你的renaming数据框里的列是因子类型,先把它们转成字符,这样mapvalues就不会乱转类型了:
# 先把renaming的列转成字符 renaming$Name <- as.character(renaming$Name) renaming$Rename <- as.character(renaming$Rename) # 再执行替换,此时输出会保持字符类型 affrete <- plyr::mapvalues( x = unlist(list_attribute$affrete, use.names = FALSE), from = renaming$Name, to = renaming$Rename, warn_missing = FALSE ) list_attribute$affrete <- affrete
办法3:换用dplyr::recode(更推荐!)
其实现在plyr已经处于维护状态,不太更新了,更推荐用tidyverse家族的dplyr::recode函数,它的类型逻辑更直观,默认会保持输入的字符类型:
library(dplyr) # 直接在数据框列上做替换,无需unlist list_attribute$affrete <- recode( list_attribute$affrete, !!!setNames(renaming$Rename, renaming$Name) # 把Name作为旧值,Rename作为新值 )
这个写法更简洁,而且几乎不会出现莫名其妙的类型转换问题。
最后可以用str(list_attribute)或者class(list_attribute$affrete)确认一下,替换后的列是不是已经变成<chr>类型啦!
内容的提问来源于stack exchange,提问作者Makoto Miyazaki
相关产品推荐
相关产品推荐

