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

无需循环从data.table单元格长字符串中筛选指定样本的物种丰度

用data.table高效生成指定样本的微生物物种丰度表

核心思路

利用data.table的原生分组展开和宽表转换操作,全程避免循环或apply类函数,最大化处理大型数据集的效率。

示例数据准备

library(data.table)

# 构造模拟数据集:每行对应一个物种,存储拆分后的样本ID列表和丰度列表
dt <- data.table(
  species = c("物种A", "物种B", "物种C"),
  sample_ids_list = list(c("S1", "S3"), c("S2", "S3"), c("S1")),
  abundances_list = list(c(0.2, 0.5), c(0.3, 0.1), c(0.7))
)

# 定义需要生成丰度表的目标样本集合
target_samples <- c("S1", "S2", "S3", "S4")

高效实现步骤

# 1. 将列表格式的样本ID和丰度展开为长格式:每个物种-样本对对应一行
long_dt <- dt[, .(sample_id = unlist(sample_ids_list), abundance = unlist(abundances_list)), by = species]

# 2. 转换为宽格式,自动填充未检出样本的丰度为0
result_dt <- dcast(long_dt, species ~ sample_id, value.var = "abundance", fill = 0)

# 3. 补充目标样本中未在展开数据里出现的样本列(如示例中的S4)
missing_samples <- setdiff(target_samples, colnames(result_dt)[-1])
if (length(missing_samples) > 0) {
  result_dt[, (missing_samples) := 0]
}

# 调整列顺序与目标样本集合一致
setcolorder(result_dt, c("species", target_samples))

关键优势

  • 全程使用data.table的底层优化操作(by分组展开、dcast宽表转换),避免R层面循环,处理大型数据集时性能远超apply系列函数。
  • dcast的fill参数直接实现未检出样本填0的需求,无需额外判断。
  • 通过setdiff和setcolorder确保最终表格严格匹配指定的样本集合和顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:35:14