使用dplyr按条件关联参考表生成新列时出现NA值的问题排查
解决dplyr中计算chrom.pos时p臂结果为NA的问题
你遇到的问题核心是没有正确关联两个表中的染色体编号,直接用chr作为索引去取lengths$q的值很容易因为类型不匹配或者行顺序问题返回NA。下面给你两种靠谱的修正方案:
方法一:先关联表再计算(推荐,可读性更强)
先通过left_join把my_data和lengths按染色体编号关联起来,这样每一行都能准确拿到对应染色体的q臂长度,再计算chrom.pos:
library(dplyr) my_data %>% # 按chr(my_data)和chrom(lengths)匹配,把对应q值带过来 left_join(lengths, by = c("chr" = "chrom")) %>% mutate(chrom.pos = case_when( arm == "q" ~ pos, arm == "p" ~ pos + q )) %>% # 可选:移除不需要的p、q列 select(-p, -q)
运行后就能得到你期望的结果:
mut pos chr arm chrom.pos A A 567 2 p 9654 B B 6890 2 q 6890 C C 978 3 q 978 D D 4689 4 p 5942
方法二:用match函数精准匹配索引
如果不想合并表,可以用match函数找到每个chr在lengths$chrom中的位置,再取对应的q值:
my_data %>% mutate(chrom.pos = case_when( arm == "q" ~ pos, # match找到chr对应的chrom在lengths中的行号,再取q值 arm == "p" ~ pos + lengths$q[match(chr, lengths$chrom)] ))
为什么原来的代码会返回NA?
你的原始写法lengths[["q"]][chr]存在两个潜在问题:
- 类型不匹配:如果
my_data$chr是字符型(比如"2"),用它作为行索引会被当成列名查找,自然返回NA; - 行顺序依赖:如果
lengths中chrom的顺序和chr的数值不严格对应(比如lengths里chrom顺序是1、3、2、4),直接用chr当行号会取错值,甚至返回NA。
而上面两种方法都避开了这些问题,确保每次取到的都是对应染色体的q臂长度。
内容的提问来源于stack exchange,提问作者Evan Bare
相关产品推荐
相关产品推荐

