如何在数据帧2中找到数据帧1的每一行的给定位置,以从数据帧2中提取信息

时间:2016-07-14 19:05:19

标签: r

嗨,我有一个复杂的问题,我无法解决如何解决问题。

我有两个数据框,我想有条件地将一列df1与df2匹配。

Df1:
gene int start_pos  end_pos  tag
A    1   233        422      a1
A    2   622        766      a2
A    3   1021       1211     ab
A    4   1400       1500     b1
A    4   2000       2200     b2
B    1   122        233      a1
B    2   332        665      a2
C    1   199        433      a1
C    2   776        899      a2

df2:
Gene  type   pos  
A     shrt   680
A     long   1420
B     shrt   350
C     long   790

我希望根据' pos'匹配这两个表。信息。

我想:检查df2中每个基因的pos(位置),并在df1中找到它的位置。例如,在df 2 A-680中的第一行,我想在df1中找到基因A,然后搜索位置680,并找到哪个'标记'对应这个位置。

所以最后我想根据df1的标签信息为df2添加一列,如下所示:

df2:
Gene  type   pos   tag 
A     shrt   680   a2
A     long   1420  b1
B     shrt   350   a2
C     long   790   a2

我无法找到解决办法。合并不起作用,因为我无法制作唯一标识符。我也找不到具有匹配功能的解决方案。

注意:df1基本上是参考数据。 df 2中的所有位置都在df1中的开始和停止之间。我想在df1中找到每个位置的标签信息。

我被困住了。任何帮助都会很棒。

谢谢!

2 个答案:

答案 0 :(得分:2)

您要加入的问题是列名称不同(基因与基因)。

以下是您要查找的代码:

library(dplyr)
Df1 <- data.frame(gene = c("A", "A","A","A","A","B","B","C","C") ,
              int = c(1,2,3,4,4,1,2,1,2),
              start_pos = c(233,622,1021,1400,2000,122,332,199,776), 
              end_pos = c(422,766,1211,1500,2200,233,665,433,899),
              tag = c("a1", "a2","ab","b1","b2" , "a1","a2","a1","a2") )


df2 <- data.frame(Gene = c("A","A","B","C"), 
              type = c("shrt", "long", "shrt", "long"),
              pos = c(680,1420,350,790))


colnames(Df1)[1] <- "Gene"       ## matching the column name

Merge_data <- inner_join(df2,Df1)
filter_data <- filter(Merge_data, pos > start_pos & pos < end_pos)

Result <- select(filter_data, c(Gene,type,pos,tag))

结果如下

   Gene type  pos tag
1    A shrt  680  a2
2    A long 1420  b1
3    B shrt  350  a2
4    C long  790  a2

答案 1 :(得分:0)

另一种更加笨拙的方法是根据每个基因位置的范围创建一个list() data.frames(此处为变量df2$pos,可能)。

可以使用for loop完成此操作,并使用which()

对数据进行子集化

首先在df2中设置新变量,然后创建两个名为list1list2的工作列表:

df2$tag <- NA
list1 <- list()
list2 <- list()

现在为for loop

for (i in 1:nrow(df2)){
  # Use list1 to create a subset matching the genes
  list1[[i]] <- na.omit(df1[which(df2$Gene[i] == df1$gene),])
  # Use list2 to create a subset where df2$pos is greater than or equal to df1$start_pos
  list2[[i]] <- na.omit(list1[[i]][which(df2$pos[i] >= list1[[i]]$start_pos),])
  # Finally assign the 'tag' for df2$pos is less than o equal to df1$end_pos
  df2$tag[i] <- as.character(list2[[i]][which(df2$pos[i] <= list2[[i]]$end_pos),"tag"])
}

我们离开了:

  Gene type  pos tag
1    A shrt  680  a2
2    A long 1420  b1
3    B shrt  350  a2
4    C long  790  a2

给你另一个选择!