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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:51:03