dplyr生成新列遇NA值及分类错误问题求助
问题描述
- 现有包含300+条记录的动物观测数据框,涵盖鲸类、海豚、鳍足类、企鹅,需新增
reino列,规则为:鲸类对应misticeto,海豚对应odontoceto,鳍足类对应pinipede,企鹅对应penguin。 - 初始代码运行后出现警告
Unknown or uninitialised column: reino,且存在以下异常:- 鲸类
Ballena franca austral (Eubalaena australis)的reino值为NA - 海豚
Delfín oscuro (Lagenorhynchus obscurus)、企鹅Pingüino rey (Aptenodytes patagonicus)被错误归类到misticeto,且该海豚未出现在odontoceto分类中 - 尝试
left_join、case_match均未解决问题,使用case_when时数据框被意外转换为formula类型
- 鲸类
问题根源
- 初始赋值的警告与NA问题:直接通过
dt$reino[条件] <- 值赋值时,reino列未预先初始化,触发警告;同时物种名字符串存在格式差异(如括号前后空格不一致),导致精准匹配失败,出现NA。 - 分类错误原因:部分物种名格式不统一(如
Ballena barbada no identificada(Parvorden Mysticeti)与Ballena barbada no identificada (Parvorden Mysticeti)),初始精准匹配逻辑无法覆盖所有情况;case_when代码存在语法错误(最后一个条件括号位置错误)与拼写错误(pinguin应为penguin),导致运行异常。 - left_join/case_match失效:两种方法仅处理了单个或少量物种,未覆盖全部分类规则。
解决方案
方法1:data.table原生实现(适合大数据量)
先初始化列,用模糊匹配规避字符串格式问题:
library(data.table) library(stringr) # 初始化reino列,消除警告 dt[, reino := NA_character_] # 按分类规则赋值,用模糊匹配覆盖格式差异 dt[especie %like% "Ballena", reino := "misticeto"] # 鲸类 dt[especie %like% "Delfín|Tonina", reino := "odontoceto"] # 海豚 dt[especie %like% "Lobo marino", reino := "pinipede"] # 鳍足类 dt[especie %like% "Pingüino", reino := "penguin"] # 企鹅 # 特殊处理Cormorán Imperial(不属于目标分类,设为NA) dt[especie == "Cormorán Imperial (Phalacrocorax albiventer)", reino := NA_character_]
方法2:修正后的dplyr case_when实现
修正语法错误,用模糊匹配提升稳健性:
library(dplyr) library(stringr) dt <- dt %>% mutate(reino = case_when( str_detect(especie, "Ballena") ~ "misticeto", str_detect(especie, "Delfín|Tonina") ~ "odontoceto", str_detect(especie, "Lobo marino") ~ "pinipede", str_detect(especie, "Pingüino") ~ "penguin", TRUE ~ NA_character_ # 未匹配的物种设为NA ))
额外优化:统一物种名格式(如需精准匹配)
若必须用精准匹配,先清理字符串格式:
# 移除括号前后多余空格,统一格式 dt[, especie := str_replace_all(especie, "\\s*\\(|\\)\\s*", "\\(")] # 或统一所有连续空格为单个空格 dt[, especie := str_squish(especie)]
验证结果
运行以下代码检查分类是否正确:
# 检查鲸类分类 table(filter(dt, reino == "misticeto")$especie) # 检查海豚分类 table(filter(dt, reino == "odontoceto")$especie)
内容的提问来源于stack exchange,提问作者Érika Soares Coelho
相关产品推荐
相关产品推荐

