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

如何在R中提取ROS非检测值并通过样本ID匹配至原始行

问题背景

我正在分析一个包含300余条数据的数据库,本次测试读取20个样本并命名为r,已完成以下预处理步骤用于ROS分析以处理非检测值:

  • 移除NA值
  • 识别exposure列含<的非检测值
  • 创建统计分析用变量exposure2

预处理代码

r$nd[!is.na(r$exposure)] <- grepl("<", r$exposure) # True=非检测值 False=实际浓度
r$exposure2 <- r$exposure # exposure2用于ROS分析
r$exposure2 <- (gsub('<', '', r$exposure))
r$exposure2 <- as.numeric(r$exposure2)
r <- r[!is.na(r$exposure),]

预处理后的数据

idjobexposuretypendexposure2
1driver0.10areaFALSE0.10
2cleaner0.09personalFALSE0.09
3mechanic0.24personalFALSE0.24
4electrician0.11areaFALSE0.11
5CSA<0.05personalTRUE0.05
6security0.05personalFALSE0.05
7driver0.08areaFALSE0.08
8CSA0.12personalFALSE0.12
9driver<0.04personalTRUE0.04
10driver<0.02areaTRUE0.02
12mechanic<0.10personalFALSE0.10
14CSA0.24personalTRUE0.24
15CSA0.11personalFALSE0.11
16driver<0.05personalFALSE0.05
17security<0.05personalFALSE0.05
18driver<0.02areaTRUE0.02
20driver0.10personalTRUE0.10

已完成的ROS分析

使用NADA包运行ROS分析,代码及结果如下:

library(NADA)
myros = ros(r$exposure2, r$nd) # 无法在这里传入样本ID
plot(myros)
summary(myros)
mean(myros); sd(myros)
quantile(myros); median(myros)
print(as.data.frame(myros))

ROS结果:

obscensoredppmodeled
0.02TRUE0.09295570.02831973
0.02TRUE0.18591140.03726359
0.04TRUE0.13943360.03300924
0.05TRUE0.13943360.03300924
0.05FALSE0.33696440.05000000
0.05FALSE0.39506170.05000000
0.05FALSE0.45315900.05000000
0.08FALSE0.51125640.08000000
0.09FALSE0.56935370.09000000
0.10FALSE0.67973860.10000000
0.10FALSE0.73202610.10000000
0.10TRUE0.31372550.04834912
0.11FALSE0.78431370.11000000
0.11FALSE0.83660130.11000000
0.12FALSE0.88888890.12000000
0.24FALSE0.97058820.24000000
0.24TRUE0.47058820.06288412

问题:尝试将ROS结果合并回原数据框r时,无法通过样本ID匹配,需要解决如何在运行ROS函数时纳入样本ID,并通过ID将结果匹配至原数据框,得到包含原数据与ROS结果的完整数据框。


解决方案

核心逻辑

ros()函数会严格按照输入向量的顺序返回结果,因此我们可以利用这一点,先将原数据的id绑定到ROS结果中,再通过id字段完成合并。

步骤1:为ROS结果添加样本ID

library(NADA)
# 运行ROS分析
myros <- ros(r$exposure2, r$nd)
# 将ROS结果转为数据框,并添加原数据的id列(行顺序完全一致)
ros_df <- as.data.frame(myros)
ros_df$id <- r$id

步骤2:合并原数据与ROS结果

使用merge()函数通过id字段匹配,参数all.x = TRUE确保保留原数据的所有行:

# 合并数据
final_data <- merge(r, ros_df, by = "id", all.x = TRUE)

步骤3:验证合并结果

查看合并后的数据集,确认原数据与ROS结果已正确匹配:

# 查看前6行数据
head(final_data)

优化预处理代码(可选)

可以简化预处理代码,让逻辑更清晰:

# 1. 移除exposure列的NA值
r <- r[!is.na(r$exposure), ]
# 2. 标记非检测值
r$nd <- grepl("<", r$exposure)
# 3. 创建分析用变量exposure2
r$exposure2 <- as.numeric(gsub("<", "", r$exposure))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:59:53