R语言:数据框列所有行除以数字结果异常,求问题原因
问题原因与解决方案
哈哈,这个问题我刚学R的时候也踩过一模一样的坑!问题出在你创建数据框时,locations列被自动转换成因子(factor)类型了,而不是你以为的字符串或者数值型。
为什么会得到奇怪的结果?
当你执行as.numeric(test$locations)时,R并没有把字符串形式的数字转成实际数值,而是把因子的「水平编码」转成了数字。举个例子,你的locations因子水平排序后可能是"32222"、"54333"、"81000",它们对应的内部编码是1、2、3,除以10自然就得到了0.1、0.2、0.3——正好和你看到的异常结果一致。
两种修正方案
方案1:先转字符再转数值
先把因子类型的locations转换成字符,再转成数值,之后再做除法:
test <- data.frame(locations=c("81000","32222","54333"), value=c(87,54,43)) test$mm <- as.numeric(as.character(test$locations)) / 10 head(test)
方案2:创建数据框时禁用自动转因子
在创建data.frame时添加stringsAsFactors=FALSE参数,让字符列保持字符串类型,后续直接转数值即可(新版本R默认已经是这个设置,但显式写出来兼容性更好):
test <- data.frame(locations=c("81000","32222","54333"), value=c(87,54,43), stringsAsFactors=FALSE) test$mm <- as.numeric(test$locations) / 10 head(test)
执行任意一种方案后,mm列都会得到你期望的8100、3222.2和5433.3啦!
内容的提问来源于stack exchange,提问作者ds_student
相关产品推荐
相关产品推荐

