R语言中将字符"?"替换为NA失效时如何计算行平均值
问题根因
之前的替换代码失效有两个核心原因:
- 界面显示的
�不是普通半角问号?,是编码解析错误时自动生成的Unicode替换字符(固定编码为U+FFFD),匹配"?"完全无法命中目标值。 - 混入该乱码的数值列会被R默认识别为字符类型,即便替换完缺失值,不转回数值格式也无法执行平均值计算。
解决方案
方法一:读入数据时直接处理(最推荐)
如果还没完成数据读入,直接在读取函数中指定该乱码为缺失值,不需要后续单独替换:
# 以csv读入为例,其他读取函数如read.table、read_excel都支持na.strings参数 df <- read.csv( file = "你的数据文件路径.csv", na.strings = c("", "NA", "\ufffd"), # 把空值、默认NA、乱码都识别为缺失值 stringsAsFactors = FALSE )
读入后直接将误转字符型的数值列转回数值格式即可:
df[] <- lapply(df, function(x) { if(is.character(x)) suppressWarnings(as.numeric(x)) else x })
方法二:已读入数据的替换处理
如果已经完成数据读入,用Unicode编码精准匹配替换乱码,不要手动输入�字符做匹配(不同编码环境下输入的字符可能存在匹配偏差):
# base R 实现 df[] <- lapply(df, function(col) { if (is.character(col)) { # 替换乱码为NA col[col == "\ufffd"] <- NA # 转数值类型,非数值内容自动转为NA col <- suppressWarnings(as.numeric(col)) } return(col) })
如果使用tidyverse工作流,可以用以下写法:
library(dplyr) df <- df %>% mutate( across( where(is.character), ~suppressWarnings(as.numeric(na_if(., "\ufffd"))) ) )
按行计算平均值
清洗完成后直接调用rowMeans计算即可,该函数是base R内置的行计算函数,运行效率远高于逐行apply循环:
# 若所有列都是参与计算的数值列,直接传入整个df df$row_avg <- rowMeans(df, na.rm = TRUE) # 若存在ID、分类等不需要参与计算的非数值列,先筛选数值列再计算 # df$row_avg <- rowMeans(df[, sapply(df, is.numeric)], na.rm = TRUE)
参数na.rm = TRUE表示计算时自动跳过NA值,符合缺失值场景下的均值计算逻辑。
内容的提问来源于stack exchange,提问作者Criss D
相关产品推荐
相关产品推荐

