You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:35:26