使用readr::parse_number处理Especie列时全生成NA的问题排查
问题排查与解决
问题背景
导入数据集后,尝试用dplyr::mutate结合readr::parse_number提取Especie列的数字,结果生成的x_1列全为NA:
library(dplyr) library(readr) # 读取数据 ds <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/parse_problem.csv") str(ds) # 'data.frame': 105 obs. of 5 variables: # $ Especie : chr "C_externa" "C_externa" "C_externa" "C_externa" ... # $ Rep : chr "R1" "R2" "R3" "R4" ... # $ Instar_IN : chr "1Instar" "1Instar" "1Instar" "1Instar" ... # $ Instar_PS : chr "ovo" "ovo" "ovo" "ovo" ... # $ Tentou_predar: int 3 25 20 36 12 0 1 10 0 14 ... # 尝试提取数字 ds.new <- ds %>% mutate(x_1=readr::parse_number(Especie),group = Especie) summary(ds.new$x_1) # Min. 1st Qu. Median Mean 3rd Qu. Max. NA's # NA NA NA NaN NA NA 105
数据集的Especie列内容仅包含"C_externa"和"C_cubana"两类字符串。
原因分析
readr::parse_number的作用是提取字符串中的数字部分,但Especie列的所有值里都没有数字字符,因此无法提取到有效数字,返回全NA。
解决方案
如果需求是给不同物种分组分配数字编码(用于绘图分组),可以用以下两种方法:
方法1:利用因子类型转换
ds.new <- ds %>% mutate( x_1 = as.integer(factor(Especie)), group = Especie )
该方法会自动给不同物种分配数字编码,C_externa默认编码为1,C_cubana编码为2;若要调整编码顺序,可通过factor(Especie, levels = c("C_cubana", "C_externa"))指定因子水平。
方法2:使用case_when手动指定编码
ds.new <- ds %>% mutate( x_1 = case_when( Especie == "C_externa" ~ 1, Especie == "C_cubana" ~ 2 ), group = Especie )
这种方式更灵活,可自定义每个物种对应的数字值。
验证结果:
summary(ds.new$x_1) # Min. 1st Qu. Median Mean 3rd Qu. Max. # 1.00 1.00 1.00 1.57 2.00 2.00
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

