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

如何在R data.table中合并两列表列并提取唯一值?

合并data.table中两个列表列并保留唯一值

问题描述

我有一个包含两个列表类型列的data.table,想要将这两列合并为一个包含唯一值的列表列,但尝试多种unique和unlist的组合都没成功。

数据结构

structure(list(c("ENSG00000000419", "ENSG00000000457"), c("20:49551404:49575092",
"1:169818772:169863100"), list(c("rs2281282", "rs7269297"), c("rs3766154",
"rs17544586", "rs11577641", "rs12116650", "rs9728301")), list(
    structure(c("rs142284790", "rs6096071"), class = "AsIs"),
    structure(c("rs12116650", "rs9728301", "rs11581380"), class = "AsIs"))), class = c("data.table",
"data.frame"), row.names = c(NA, -2L), names = c("GENE", "LOC",
"SNP1", "SNP2"))

尝试过的代码

out[, SNP := unique(unlist(c(.SD))), .SDcols=c("SNP1", "SNP2"), by=out[,.I]]
out[, SNP := unique(unlist(c(SNP1, SNP2)))]
out[, SNP := list(unique(unlist(c(SNP1, SNP2)))), by=out[,.I]]
out[, SNP := lapply(.SD, unique), .SDcols=c("SNP1", "SNP2")]
out[, SNP := lapply(.SD, function(i) unique(unlist(c(i)))), .SDcols=c("SNP1", "SNP2")]
out[, SNP := lapply(.SD, function(i) unique(unlist(c(i)))), .SDcols=c("SNP1", "SNP2"), by=out[,.I]]

期望输出

新增一个列表列SNP,包含两列合并后的唯一值:

> out[, .(GENE, LOC, SNP)]
              GENE                   LOC
1: ENSG00000000419  20:49551404:49575092
2: ENSG00000000457 1:169818772:169863100
                                                               SNP
1:                       rs2281282,rs7269297,rs142284790,rs6096071
2: rs3766154,rs17544586,rs11577641,rs12116650,rs9728301,rs11581380

解决方案

直接按行处理,合并两个列表列后去重并重新包装为列表即可:

out[, SNP := list(unique(unlist(c(SNP1, SNP2)))), by = .I]

关键说明

  • by = .I:保证每一行独立处理,避免跨行合并数据
  • c(SNP1, SNP2):将当前行的两个列表列合并为一个嵌套列表
  • unlist():把嵌套列表展开为一维向量
  • unique():去除向量中的重复值
  • list():将去重后的向量重新包装为列表,确保新列SNP为列表类型

结果验证

运行上述代码后,执行out[, .(GENE, LOC, SNP)]即可得到与期望一致的输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:53:13