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

如何为R语言数据框开发相对百分比差异(RPD)函数?

R新手解决指南:计算RPD并处理NA值

步骤1:加载数据

首先用你提供的dput代码重建数据框:

QCandResults <- structure(list(anl_short = c("Water Temp               ", "Water Temp               ", 
"Water Temp               ", "Water Temp               ", "Water Temp               ", 
"Water Temp               "), Sample_Num = c(202309111300030, 
2.02308301e+14, 202308091000030, 202308221000020, 202308031100110, 
202308301000060), QC_SAMPLE = c(202309111341030, 202308301041000, 
202308091041030, 202308221041020, 202308031141110, 202308301041060
), Loc_ID = c("GRR20001", "CFK20001", "CCK20001", "CRR20001", 
"BVR20001", "CFK20001"), Units_QC = c("deg C", "deg C", "deg C", 
"deg C", "deg C", "deg C"), Value_QC = c(19.26, 27.01, 17.19, 
26.39, 8.51, 11.6), Text_Value_QC = c("19.26", "27.01", "17.19", 
"26.39", "8.51", "11.6"), QC_Type = c("DUP", "DUP", "DUP", "DUP", 
"DUP", "DUP"), Units_Results = c("deg C", "deg C", "deg C", "deg C", 
"deg C", "deg C"), Value_Results = c(19.39, 26.95, 17.28, 26.3, 
8.53, 11.53), Text_Value_Results = c("19.39", "26.95", "17.28", 
"26.3", "8.53", "11.53")), row.names = c(1L, 3L, 5L, 7L, 9L, 
11L), class = "data.frame")

步骤2:处理NA值

将Value_QC和Value_Results中的NA替换为0,提供两种实现方式:

方法一:用dplyr(代码更直观)

先安装并加载dplyr包:

install.packages("dplyr")
library(dplyr)

替换NA值:

QCandResults_clean <- QCandResults %>%
  mutate(
    Value_QC = replace_na(Value_QC, 0),  # 把Value_QC的NA替换为0
    Value_Results = replace_na(Value_Results, 0)  # 把Value_Results的NA替换为0
  )

方法二:用基础R(无需额外包)

QCandResults$Value_QC[is.na(QCandResults$Value_QC)] <- 0
QCandResults$Value_Results[is.na(QCandResults$Value_Results)] <- 0

步骤3:计算相对百分比差异(RPD)

RPD标准计算公式:

RPD = (|QC值 - 结果值| / ((QC值 + 结果值)/2)) × 100

注意:若QC值和结果值均为0,分母会为0,此时将RPD设为0避免报错。

dplyr版本计算

QCandResults_clean <- QCandResults_clean %>%
  mutate(
    RPD = ifelse(
      (Value_QC + Value_Results) == 0,  # 判断是否分母为0
      0,  # 分母为0时RPD设为0
      (abs(Value_QC - Value_Results) / ((Value_QC + Value_Results)/2)) * 100  # 正常计算RPD
    )
  )

基础R版本计算

QCandResults$RPD <- ifelse(
  (QCandResults$Value_QC + QCandResults$Value_Results) == 0,
  0,
  (abs(QCandResults$Value_QC - QCandResults$Value_Results) / 
     ((QCandResults$Value_QC + QCandResults$Value_Results)/2)) * 100
)

步骤4:封装为可复用函数

把上述步骤打包成函数,方便重复调用:

dplyr版本函数

calculate_RPD <- function(df) {
  # 自动安装加载dplyr
  if (!require(dplyr)) {
    install.packages("dplyr")
    library(dplyr)
  }
  
  # 处理NA并计算RPD
  df_processed <- df %>%
    mutate(
      Value_QC = replace_na(Value_QC, 0),
      Value_Results = replace_na(Value_Results, 0)
    ) %>%
    mutate(
      RPD = ifelse(
        (Value_QC + Value_Results) == 0,
        0,
        (abs(Value_QC - Value_Results) / ((Value_QC + Value_Results)/2)) * 100
      )
    )
  
  return(df_processed)
}

# 调用函数
QCandResults_with_RPD <- calculate_RPD(QCandResults)

基础R版本函数

calculate_RPD_base <- function(df) {
  # 替换NA为0
  df$Value_QC[is.na(df$Value_QC)] <- 0
  df$Value_Results[is.na(df$Value_Results)] <- 0
  
  # 计算RPD
  df$RPD <- ifelse(
    (df$Value_QC + df$Value_Results) == 0,
    0,
    (abs(df$Value_QC - df$Value_Results) / 
       ((df$Value_QC + df$Value_Results)/2)) * 100
  )
  
  return(df)
}

# 调用函数
QCandResults_with_RPD <- calculate_RPD_base(QCandResults)

查看结果

运行函数后,QCandResults_with_RPD会新增RPD列,包含每行的计算结果。例如你提供的样本数据第一行的RPD约为0.67%。


内容的提问来源于stack exchange,提问作者Matt Schaaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:30:57