如何检查数据框之间行元素的相似性
How to check the similarity of row elements between data frames
我有多个数据框,每个数据框有 2 列感兴趣,ID 表示每行中的样本,另一列称为成员资格,表示该样本的集群成员资格。
在数据框之间,相同的样本ID代表相同的样本,但隶属数只是一个任意数字。即样本 A 和 B 在 df1 中的成员资格为 1,并且它们在 df2 中的成员资格为 2,但结论是相同的:A 和 B 在 df1 和 df2 中处于同一集群中。
现在我想比较不等长的数据帧,找出样本 A 与样本 B 在同一簇中的一致性。
#----- dummy data
df1 <- data.frame(paste0("S", seq(1:25)), rep(c(1:5), 5))
df2 <- data.frame(paste0("S", seq(1:30)), rep(c(0:4), 6))
colnames(df1) <- c("ID", "membership")
colnames(df2) <- c("ID", "membership")
正如你在虚拟数据中看到的,S1、S6、S11、S16 和 S21 在 df1(左)中保持在一起,在 df2(右)中也保持在一起,尽管它们的成员数值不同, 簇大小不同
我可以通过对几个数据集使用冲积图来直观地检查这一点,但是如果我有几十个这样的数据集,我想要一个量化的数字来描述 preserved/similar 个样本就成员资格而言,它们在不同的数据集中。
在此示例中,df1 和 df2 之间的简单输出可以是 S1、S6、S11、S16 和 S21 一起为 100%。如果在 df2 中只有 S1、S6、S11 和 S16 在同一个集群中,那么在 df2 中检查时,来自 df1 的集群 1 只有 75% 完好无损。
因此,该过程将在较短的 df 中按成员资格(比如 5)将样本识别到组中,然后查看有多少样本保持在一起,比如 4。那么相似度将为 4/5。
如果有更合适的方法,请赐教。谢谢指点
我们可以根据两个数据中的成员身份将 ID 拆分为 list
的 vector
idlist1 <- with(df1, split(ID, membership))
idlist2 <- with(df2, split(ID, membership))
然后,创建一个命名的成员资格向量来匹配其他成员资格,根据 match
对列表元素进行排序,并在 Map
中使用它来获得相应的 intersect
ID的元素
nm1 <- setNames(as.character(1:5), 0:4)
Map(intersect, idlist1, idlist2[match(names(idlist2), names(nm1))])
我有多个数据框,每个数据框有 2 列感兴趣,ID 表示每行中的样本,另一列称为成员资格,表示该样本的集群成员资格。
在数据框之间,相同的样本ID代表相同的样本,但隶属数只是一个任意数字。即样本 A 和 B 在 df1 中的成员资格为 1,并且它们在 df2 中的成员资格为 2,但结论是相同的:A 和 B 在 df1 和 df2 中处于同一集群中。
现在我想比较不等长的数据帧,找出样本 A 与样本 B 在同一簇中的一致性。
#----- dummy data
df1 <- data.frame(paste0("S", seq(1:25)), rep(c(1:5), 5))
df2 <- data.frame(paste0("S", seq(1:30)), rep(c(0:4), 6))
colnames(df1) <- c("ID", "membership")
colnames(df2) <- c("ID", "membership")
正如你在虚拟数据中看到的,S1、S6、S11、S16 和 S21 在 df1(左)中保持在一起,在 df2(右)中也保持在一起,尽管它们的成员数值不同, 簇大小不同
我可以通过对几个数据集使用冲积图来直观地检查这一点,但是如果我有几十个这样的数据集,我想要一个量化的数字来描述 preserved/similar 个样本就成员资格而言,它们在不同的数据集中。
在此示例中,df1 和 df2 之间的简单输出可以是 S1、S6、S11、S16 和 S21 一起为 100%。如果在 df2 中只有 S1、S6、S11 和 S16 在同一个集群中,那么在 df2 中检查时,来自 df1 的集群 1 只有 75% 完好无损。
因此,该过程将在较短的 df 中按成员资格(比如 5)将样本识别到组中,然后查看有多少样本保持在一起,比如 4。那么相似度将为 4/5。
如果有更合适的方法,请赐教。谢谢指点
我们可以根据两个数据中的成员身份将 ID 拆分为 list
的 vector
idlist1 <- with(df1, split(ID, membership))
idlist2 <- with(df2, split(ID, membership))
然后,创建一个命名的成员资格向量来匹配其他成员资格,根据 match
对列表元素进行排序,并在 Map
中使用它来获得相应的 intersect
ID的元素
nm1 <- setNames(as.character(1:5), 0:4)
Map(intersect, idlist1, idlist2[match(names(idlist2), names(nm1))])