如何基于两列对R data-frame取交集并保留UP/DOWN状态信息
R 实现DataFrame按多列取交集并保留附属列信息
你现有代码仅按ENSEMBL单列取交集,自然会丢失UP_DOWN的状态标注,根据你是否要求两列完全匹配,可以选择以下两种实现方案:
方案1:要求ENSEMBL和UP_DOWN状态完全匹配才算交集
这种场景等价于取两个表中两列值完全一致的共同行,有两种常用实现:
(1)使用dplyr包的inner_join(推荐,代码简洁)
# 加载包,没装的话先运行 install.packages("dplyr") library(dplyr) # 按两列取交集,默认保留匹配行的所有信息 result <- inner_join(Region, gene, by = c("ENSEMBL", "UP_DOWN")) # 如果需要区分某行是否在两个表中都存在、同时保留两个表的原始状态列,可以加keep参数 result_with_origin <- inner_join(Region, gene, by = "ENSEMBL", keep = TRUE)
(2)基础R实现,无需额外安装包
# 用merge函数的内连接模式,效果和inner_join一致 result <- merge(Region, gene, by = c("ENSEMBL", "UP_DOWN"))
用你给出的示例数据运行后,返回的结果将包含匹配行ENSG00000000938 UP,完整保留两列信息。
方案2:仅要求ENSEMBL匹配,保留两个表对应的UP_DOWN状态
如果你只要ENSEMBL在两个表中都出现就算交集,同时要保留两个表各自的UP_DOWN标注,可以只按ENSEMBL列连接:
library(dplyr) result <- inner_join(Region, gene, by = "ENSEMBL", suffix = c("_Region", "_gene"))
返回的结果会包含ENSEMBL、UP_DOWN_Region(第一个表的状态)、UP_DOWN_gene(第二个表的状态)三列,不会丢失状态信息。
如果你一定要用intersect函数实现
可以先将两列拼接为唯一标识,再按标识筛选:
# 为两个表生成唯一标识列 Region$unique_id <- paste(Region$ENSEMBL, Region$UP_DOWN, sep = "|") gene$unique_id <- paste(gene$ENSEMBL, gene$UP_DOWN, sep = "|") # 取共同标识,再筛选原表的行 common_id <- intersect(Region$unique_id, gene$unique_id) result <- Region[Region$unique_id %in% common_id, c("ENSEMBL", "UP_DOWN")]
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

