遍历数据框清洗含LOQ值的数据的实现方法咨询
处理含LOQ值的参数列:拆分数值与标记列的实现方案
准备示例数据
先构造一个和你场景匹配的数据集,包含日期、站点及带LOQ值的参数列:
library(tidyverse) # 模拟原始数据集 raw_df <- tibble( Date = as.Date(c("2023-01-01", "2023-01-02", "2023-01-03", "2023-01-04")), Station = c("A", "B", "A", "B"), Fe = c("<5", "12.3", "<5", "8.9"), Cu = c("8.7", "<3", "10.1", "<3"), `N-tot` = c("25", "<10", "30", "22") )
核心实现:用dplyr拆分参数列
通过across批量处理所有参数列,同时生成数值列和LOQ标记列,代码逻辑清晰且可扩展:
processed_df <- raw_df %>% mutate( # 对所有非Date/Station的列批量处理 across( -c(Date, Station), list( # 提取数值:移除<符号后转数值型 value = ~ as.numeric(gsub("<", "", .x)), # LOQ标记:判断是否包含<符号,返回布尔值 loq = ~ str_detect(.x, "<") ), # 自动命名新列:原列名_函数名(如Fe_value、Fe_loq) .names = "{.col}_{.fn}" ) ) %>% # 可选:删除原始参数列,只保留处理后的列 select(-c(Fe, Cu, `N-tot`))
处理后的数据预览
print(processed_df) # # A tibble: 4 × 8 # Date Station Fe_value Fe_loq Cu_value Cu_loq `N-tot_value` `N-tot_loq` # <date> <chr> <dbl> <lgl> <dbl> <lgl> <dbl> <lgl> # 1 2023-01-01 A 5 TRUE 8.7 FALSE 25 FALSE # 2 2023-01-02 B 12.3 FALSE 3 TRUE 10 TRUE # 3 2023-01-03 A 5 TRUE 10.1 FALSE 30 FALSE # 4 2023-01-04 B 8.9 FALSE 3 TRUE 22 FALSE
扩展用法
LOQ标记转可读标签(适合绘图):
processed_df <- processed_df %>% mutate( across(ends_with("_loq"), ~ factor(.x, levels = c(TRUE, FALSE), labels = c("低于LOQ", "高于LOQ"))) )绘图示例(用LOQ标记区分点样式):
ggplot(processed_df, aes(x = Date, y = Fe_value, shape = Fe_loq, color = Fe_loq)) + geom_point(size = 3) + scale_shape_manual(values = c(1, 16)) + scale_color_manual(values = c("#ff4d4d", "#3399ff")) + labs(title = "Fe浓度随时间变化", y = "Fe含量", shape = "LOQ状态", color = "LOQ状态") + theme_minimal()统计量计算(按站点分组统计):
processed_df %>% group_by(Station) %>% summarise( Fe均值 = mean(Fe_value, na.rm = TRUE), Fe中位数 = median(Fe_value, na.rm = TRUE), Fe低于LOQ样本数 = sum(Fe_loq == "低于LOQ", na.rm = TRUE), 总样本数 = n() )
内容的提问来源于stack exchange,提问作者Martin Liungman
相关产品推荐
相关产品推荐

