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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:30:53