首页 > 解决方案 > 如何合并两个数据框并根据巧合填充不同的选项

问题描述

我有两个数据框yz

y <- data.frame(ID = c("A", "A", "A", "B", "B"), gene = c("a", "b", "c", "a", "c"))
z <- data.frame(A = c(2,6,3), B = c(8,4,9), C=c(1,6,2))
rownames(z) <- c("a", "b", "c")

因此,对于 y,我有一个表格,其中包含每个患者的患者 ID 和基因,并且在 ZI 中,第一行有相同的患者 ID,以及具有特定值的基因列表(这在此处并不重要)。y 中的基因在 z 中,但在 z 中有些基因不包含在 y 中。我想要做的是merge这个框架并有这样的东西:

       a   b   c
A      1   1   1 
B      1   0   1 

所以对于每个患者,如果基因zy,填1,如果不是,填0

我真的不知道如何处理这个,有什么想法吗?谢谢

标签: rmerge

解决方案


我从您的问题中提出了 RE(下次将此添加到您的问题中):

y <- data.frame(ID = c("id_A", "id_A", "id_A", "id_B", "id_B"), gene = c("a", "b", "c", "a", "c"))
z <- data.frame(id_A = c(2,6,3), id_B = c(8,4,9), id_C=c(1,6,2))
rownames(z) <- c("a", "b", "c")

这里的想法是针对pivot_longer您的桌子,这样您就可以轻松加入。

为此,您首先需要将您的行名放入一个字段中:

z <- tibble::rownames_to_column(z, "gene")

然后,您在z表中旋转更长的时间:

library(tidyr)
z_long <- pivot_longer(z, starts_with("id_"), names_to = "ID")

并将其与您的y表连接起来:

library(dplyr)
table_join <- left_join(y, z_long)

最后,您只需要计算频率:

table(table_join$ID, table_join$gene)
   
       a b c
  id_A 1 1 1
  id_B 1 0 1

推荐阅读