我有两个数据帧y
和z
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和基因的表,对于Z,我在第一行中有相同的患者ID和具有特定值的基因列表(这里不重要)。y中的基因在z中,但z中有一些基因不包含在y中。我要做的是将这些帧设置为merge
并添加如下内容:
a b c
A 1 1 1
B 1 0 1
因此对于每个病人,如果z
中的基因也存在于y,
中,则填1,如果不存在,则填0
我真的不知道如何处理这个,你有什么主意吗?谢谢你
我从你的问题中做出了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