R替换CSV缺失值为0报double转character类型错误如何解决
问题根因
报错由赋值时的列类型不匹配导致:
- 你使用的
covid19j_20200613[is.na(covid19j_20200613)] <- 0是全局赋值写法,会扫描数据框所有列,只要识别到缺失值就写入数值型的0 - 该数据框包含多列字符类型字段(如日文县名、英文县名字段),且
serious列因源数据存在格式混杂,被read_csv自动识别为字符类型,数值型的0无法直接写入字符类型的列,因此触发类型转换错误。
解决方案
放弃全局无差别赋值的写法,使用dplyr的跨列处理逻辑,仅对数值型列执行缺失值替换,避开字符列的类型冲突。
将原代码最后一行的全局赋值替换为以下代码即可:
# 已加载tidyverse可忽略重复加载 library(tidyverse) covid19j_20200613 <- covid19j_20200613 %>% mutate(across(where(is.numeric), ~tidyr::replace_na(.x, 0)))
如果需要修正被误识别为字符型的数值列(比如本次报错涉及的serious列、存在空值的effectiveReproductionNumber列),可以先做类型转换再替换缺失值,避免后续统计分析出错:
covid19j_20200613 <- covid19j_20200613 %>% mutate( # 将存储数值的字符列转为数值类型,无法转换的内容统一识别为缺失值 across(c(serious, effectiveReproductionNumber), as.numeric), # 所有数值列的缺失值替换为0 across(where(is.numeric), ~tidyr::replace_na(.x, 0)) )
注意:包含多类型列的数据框不要使用
df[is.na(df)] <- 值的写法做缺失值替换,该写法会无差别操作所有列,只要存在非数值/非统一类型的列就极易触发类型报错。
内容的提问来源于stack exchange,提问作者farinelli
相关产品推荐
相关产品推荐

