R语言:列值匹配向量元素时从对应向量取值的实现问题
问题原因
你原代码的问题在于使用ifelse时,当Protein %in% genes为真,你直接返回了整个genes_names向量,而不是对应匹配位置的单个元素,导致无法正确映射。
解决方案
这里提供几种简洁的实现方式:
方法1:使用match函数映射
利用match找到每个Protein在genes中的索引,再提取对应的genes_names,无匹配项则填"no":
library(tidyverse) data = read.table(text="gene1 gene2 gene3", sep="\t", col.names = c("Protein")) genes = c("gene1", "gene3") genes_names = c("name1", "name3") data %>% mutate(ToLabel = ifelse(is.na(match(Protein, genes)), "no", genes_names[match(Protein, genes)]))
方法2:利用命名向量快速映射
先创建一个以genes为名称、genes_names为值的命名向量,再用coalesce替换无匹配的NA为"no":
name_map = setNames(genes_names, genes) data %>% mutate(ToLabel = coalesce(name_map[Protein], "no"))
方法3:通过左连接实现映射
将genes和genes_names转换为数据框,与原数据左连接后替换NA:
label_df = tibble(Protein = genes, ToLabel = genes_names) data %>% left_join(label_df, by = "Protein") %>% mutate(ToLabel = replace_na(ToLabel, "no"))
以上三种方法都能得到你预期的输出:
Protein ToLabel gene1 name1 gene2 no gene3 name3
内容的提问来源于stack exchange,提问作者Saraha
相关产品推荐
相关产品推荐

