我有两个数据框competitor_sheet
和left_join_prototype
,我将它们分别称为 df1 和 df2, df1 和 df2 分别包含有关基因和疾病 ID 的信息,如下所示:
df1:
HUGO_symbol | MeSH_ID |
---|---|
P53 | D000310 |
A1BG | D0002277 |
ZZZ3 | D000230 |
df2:
基因名称 | 父级MeSH.ID | 子代号 |
---|---|---|
P53 | D000310 | D015675、D006676 |
HGA2 | D031031 | D002277 |
ZZZ3 | D001163, D000230 | D003451 |
如您所见,df2 可能在父和子 MeSH ID 中包含多个 ID。本质上,如果子代或父代中的任何 MeSH ID 对应于 df1 中的 MeSH ID,我想要做的是将 df2 中的任何行左连接到 df1,但仅当 Gene.Name = HUGO_symbol 时,最终产品应该看起来像这样:
HUGO_symbol | MeSH_ID | 基因名称 | 父.Mesh.ID | 子代号 |
---|---|---|---|---|
P53 | D000310 | P53 | D000310 | D015675、D006676 |
ZZZ3 | D000230 | ZZZ3 | D001163、D00230 | D003451 |
我已经尝试过使用 dplyr 的东西,看起来像这样:
proto <- left_join(df1,df2, by = c("MeSH_ID"="Parent.MeSH.ID", "HUGO_Symbol"="Gene.Name", "MeSH_ID2"="Child.MeSH.ID"))
proto
新桌子在哪里,但我觉得这是错误的。
与往常一样,非常感谢任何帮助:)
问题是 left_join 寻找完全匹配,没有什么像“匹配这个或那个”。因此,要达到您想要的结果,您可以
Parent.MeSH.ID
和Child.MeSH.ID
放入一个新列MeSH_ID
tidyr::separate_rows
。这样做可以通过 ID 加入 df。semi_join
过滤掉 df1 中与新创建的 df3 中匹配的行,最后执行 aleft_join
添加来自 df3 的列。或者,如果保留两者都无关紧要HUGO_symbol
,Gene.Name
您可以使用inner_join
.df1 <- data.frame(
stringsAsFactors = FALSE,
HUGO_symbol = c("P53", "A1BG", "ZZZ3"),
MeSH_ID = c("D000310", "D0002277", "D000230")
)
df2 <- data.frame(
stringsAsFactors = FALSE,
Gene.Name = c("P53", "HGA2", "ZZZ3"),
Parent.MeSH.ID = c("D000310", "D031031", "D001163, D000230"),
Child.MeSH.ID = c("D015675, D006676", "D002277", "D003451")
)
library(dplyr)
library(tidyr)
df3 <- df2 %>%
unite("MeSH_ID", Parent.MeSH.ID, Child.MeSH.ID, sep = ", ", remove = FALSE) %>%
separate_rows(MeSH_ID, sep = ", ")
semi_join(df1, df3, by = c("HUGO_symbol" = "Gene.Name", "MeSH_ID")) %>%
left_join(df3)
#> Joining, by = "MeSH_ID"
#> HUGO_symbol MeSH_ID Gene.Name Parent.MeSH.ID Child.MeSH.ID
#> 1 P53 D000310 P53 D000310 D015675, D006676
#> 2 ZZZ3 D000230 ZZZ3 D001163, D000230 D003451
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句