R语言按df1样本匹配情况为ref数据框新增列并填充REF/ALT值
解决方案
你可以直接通过长表转宽表+缺失值替换实现,不需要手动新建空列填充NA,以下是两种实现方式:
方法一:从原始df1一步生成结果
library(dplyr) library(tidyr) # 原始数据框 df1 <- data.frame( sample_id = c('SB024', 'SB026', 'SB027', 'SB026', 'SB027'), VAR = c('10g.76789732G>A','10g.76789732G>A','10g.76789732G>A','11g.102195430G>A','11g.102195430G>A'), REF = c('G','G','G','C','C'), ALT = c('A','A','A','T','T')) result <- df1 %>% # 去重保留所有VAR、REF、ALT、样本的对应关系 distinct(VAR, REF, ALT, sample_id) %>% # 转换为宽表,存在匹配记录的位置填充ALT pivot_wider(names_from = sample_id, values_from = ALT) %>% # 所有无匹配的NA值替换为当前行的REF mutate(across(all_of(unique(df1$sample_id)), ~ifelse(is.na(.), REF, .)))
方法二:基于你已生成的ref对象继续处理
如果你已经提前生成好了ref数据框,可以直接批量遍历样本列赋值:
# 获取所有样本ID samples <- unique(df1$sample_id) result <- ref %>% # 逐列判断每个VAR是否在对应样本的匹配列表中 mutate(across(all_of(samples), ~ifelse(VAR %in% df1$VAR[df1$sample_id == cur_column()], ALT, REF)))
运行后得到的result就是你需要的最终结果。
内容的提问来源于stack exchange,提问作者zw_nz
相关产品推荐
相关产品推荐

