This question already has answers here:
Find point-to-range overlaps

(3个答案)



Finding overlap in ranges with R

(6个答案)



dplyr left_join by less than, greater than condition

(4个答案)


去年关闭。




我有两个数据框:一个带有SNP及其位置的列表,另一个带有基因及其起始和结束坐标的列表。 使用dplyr ,我想在SNP数据框中添加一列,其名称为每个SNP所属的基因的名称(即SNP的位置在同一染色体上,并且位于开始/结束坐标之间(包括该基因)。

如果SNP不在任何基因坐标内,则应在基因列中得到“NA”。 SNP和基因之间的染色体数必须匹配。例如,即使第二个SNP的位置落在Gene4的开始/结束坐标之内,但这也不匹配,因为它们位于不同的染色体上。

SNP数据帧:
CHR  POS  REF  ALT
01   5    C    T
01   10   G    A
02   5    G    T
02   15   C    A
02   20   T    C
03   10   A    G
03   20   C    T

GENE数据框:
CHR  START  END  GENE_NAME
01   2      8    Gene1
01   12     20   Gene2
01   25     30   Gene3
02   10     18   Gene4
02   25     35   Gene5
03   5      15   Gene6

所需输出:
CHR  POS  REF  ALT  GENE_NAME
01   5    C    T    Gene1
01   10   G    A    NA
02   5    G    T    NA
02   15   C    A    Gene4
02   20   T    C    NA
03   10   A    G    Gene6
03   20   C    T    NA

同样,我想使用dplyr完成此操作。在此先感谢您的帮助!

最佳答案

使用map2_chr中的purrr的一种方法是根据GENE中的POSCHR过滤SNP数据帧,然后选择相应的GENE_NAME

library(dplyr)
library(purrr)

SNP %>%
   mutate(GENE_NAME = map2_chr(POS, CHR, function(x, y) {
       inds = x >= GENE$START & x <= GENE$END & y == GENE$CHR
      if (any(inds)) GENE$GENE_NAME[which.max(inds)] else NA
 }))

#  CHR POS REF ALT GENE_NAME
#1   1   5   C   T     Gene1
#2   1  10   G   A      <NA>
#3   2   5   G   T      <NA>
#4   2  15   C   A     Gene4
#5   2  20   T   C      <NA>
#6   3  10   A   G     Gene6
#7   3  20   C   T      <NA>

在基数R中,可以使用mapply编写
mapply(function(x, y) {
   inds = x >= GENE$START & x <= GENE$END & y == GENE$CHR
   if (any(inds)) GENE$GENE_NAME[which.max(inds)] else NA
}, SNP$POS, SNP$CHR)

#[1] "Gene1" NA      NA      "Gene4" NA      "Gene6" NA

数据
SNP <- structure(list(CHR = c(1L, 1L, 2L, 2L, 2L, 3L, 3L), POS = c(5L,
10L, 5L, 15L, 20L, 10L, 20L), REF = c("C", "G", "G", "C", "T",
"A", "C"), ALT = c("T", "A", "T", "A", "C", "G", "T")), class =
"data.frame", row.names = c(NA, -7L))

GENE <- structure(list(CHR = c(1L, 1L, 1L, 2L, 2L, 3L), START = c(2L,
12L, 25L, 10L, 25L, 5L), END = c(8L, 20L, 30L, 18L, 35L, 15L),
GENE_NAME = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5",
"Gene6")), class = "data.frame", row.names = c(NA, -6L))

关于r - 根据SNP位置和基因开始/结束坐标,从另一个数据框中分配基因名称。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56454072/

10-12 06:04