嗨,我有一个复杂的问题,我无法解决如何解决问题。
我有两个数据框,我想有条件地将一列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中找到每个位置的标签信息。
我被困住了。任何帮助都会很棒。
谢谢!
答案 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
中设置新变量,然后创建两个名为list1
和list2
的工作列表:
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
给你另一个选择!