如何在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),]
预处理后的数据
| id | job | exposure | type | nd | exposure2 |
|---|---|---|---|---|---|
| 1 | driver | 0.10 | area | FALSE | 0.10 |
| 2 | cleaner | 0.09 | personal | FALSE | 0.09 |
| 3 | mechanic | 0.24 | personal | FALSE | 0.24 |
| 4 | electrician | 0.11 | area | FALSE | 0.11 |
| 5 | CSA | <0.05 | personal | TRUE | 0.05 |
| 6 | security | 0.05 | personal | FALSE | 0.05 |
| 7 | driver | 0.08 | area | FALSE | 0.08 |
| 8 | CSA | 0.12 | personal | FALSE | 0.12 |
| 9 | driver | <0.04 | personal | TRUE | 0.04 |
| 10 | driver | <0.02 | area | TRUE | 0.02 |
| 12 | mechanic | <0.10 | personal | FALSE | 0.10 |
| 14 | CSA | 0.24 | personal | TRUE | 0.24 |
| 15 | CSA | 0.11 | personal | FALSE | 0.11 |
| 16 | driver | <0.05 | personal | FALSE | 0.05 |
| 17 | security | <0.05 | personal | FALSE | 0.05 |
| 18 | driver | <0.02 | area | TRUE | 0.02 |
| 20 | driver | 0.10 | personal | TRUE | 0.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结果:
| obs | censored | pp | modeled |
|---|---|---|---|
| 0.02 | TRUE | 0.0929557 | 0.02831973 |
| 0.02 | TRUE | 0.1859114 | 0.03726359 |
| 0.04 | TRUE | 0.1394336 | 0.03300924 |
| 0.05 | TRUE | 0.1394336 | 0.03300924 |
| 0.05 | FALSE | 0.3369644 | 0.05000000 |
| 0.05 | FALSE | 0.3950617 | 0.05000000 |
| 0.05 | FALSE | 0.4531590 | 0.05000000 |
| 0.08 | FALSE | 0.5112564 | 0.08000000 |
| 0.09 | FALSE | 0.5693537 | 0.09000000 |
| 0.10 | FALSE | 0.6797386 | 0.10000000 |
| 0.10 | FALSE | 0.7320261 | 0.10000000 |
| 0.10 | TRUE | 0.3137255 | 0.04834912 |
| 0.11 | FALSE | 0.7843137 | 0.11000000 |
| 0.11 | FALSE | 0.8366013 | 0.11000000 |
| 0.12 | FALSE | 0.8888889 | 0.12000000 |
| 0.24 | FALSE | 0.9705882 | 0.24000000 |
| 0.24 | TRUE | 0.4705882 | 0.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
相关产品推荐
相关产品推荐

