R语言提取数据框列表中满足Mscore阈值的元素与列名方法
实现方案
第一步:调整原有计算逻辑,直接返回列名而非索引
你可以基于原有函数改造,直接返回每个数据框符合阈值要求的列名,再批量绑定成最终数据框,基于tidyverse的示例代码如下:
library(outliers) library(purrr) library(tibble) # 自定义异常值检测函数,返回符合阈值的列名 get_outlier_labs <- function(df, threshold = 3) { # 对每列计算M score(基于MAD的修正z分数) m_scores <- apply(df, 2, function(x) scores(x, type = "mad")) # 筛选得分超过阈值的列名 colnames(df)[which(m_scores > threshold)] } # 批量处理整个数据框列表,直接生成目标结构数据框 # 注意此处要求你的原始数据框列表analyte_list是命名列表,列表名即为化合物名 result <- imap_dfr(analyte_list, function(lab_data, analyte_name) { outlier_labs <- get_outlier_labs(lab_data) tibble( Analyte = analyte_name, Lab_ID = outlier_labs ) })
如果你偏好使用base R实现,可用以下代码:
get_outlier_labs <- function(df, threshold = 3) { m_scores <- apply(df, 2, function(x) scores(x, type = "mad")) colnames(df)[which(m_scores > threshold)] } result_list <- lapply(names(analyte_list), function(analyte) { labs <- get_outlier_labs(analyte_list[[analyte]]) if(length(labs) == 0) return(NULL) data.frame(Analyte = analyte, Lab_ID = labs, stringsAsFactors = FALSE) }) result <- do.call(rbind, result_list)
注意事项
- 必须保证你的数据框列表
analyte_list是命名列表,也就是每个元素都有对应的化合物名作为列表名,否则Analyte列会取不到对应值 - 如果某一个化合物下没有符合阈值的异常实验室,上述代码会自动跳过该化合物,不会生成空行
- 你可以直接调整
threshold参数自定义M score的截断阈值
内容的提问来源于stack exchange,提问作者Spooked
相关产品推荐
相关产品推荐

