如何在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
相关产品推荐
相关产品推荐

