首页 > 解决方案 > 如何检查数据帧之间行元素的相似性

问题描述

我有多个数据框,每个数据框有 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(右)中它们也保持在一起,尽管它们的成员数不同,并且它们的大小集群不同。

我可以通过对几个数据集使用冲积图来直观地检查这一点,但是如果我有几十个这样的数据集,我想要一个量化的数字来描述不同数据集中的保存/相似样本在以下方面的完好程度他们的会员资格。

一个简单的输出可能是 S1、S6、S11、S16 和 S21,在此示例中,df1 和 df2 之间的比例为 100%。如果在 df2 中只有 S1、S6、S11 和 S16 在同一个集群中,那么在 df2 中检查时,来自 df1 的集群 1 只有 75% 完好无损。

因此,该过程将通过较短 df 中的成员资格(例如 5)将样本识别成组,然后查看有多少样本保持在一起,例如 4。那么相似性将是 4/5。

如果有更合适的方法可以做到这一点,请赐教。谢谢你的指点。

df1 df2

标签: rsimilarity

解决方案


我们可以通过两个数据中的成员身份将 ID 拆分listvector

idlist1 <- with(df1, split(ID, membership))
idlist2 <- with(df2, split(ID, membership))

然后,创建一个命名的隶属向量来匹配 other 中的隶属关系,根据 对列表元素进行排序match并使用它Map来获取intersectID 的对应元素

nm1 <- setNames(as.character(1:5), 0:4)
Map(intersect, idlist1, idlist2[match(names(idlist2), names(nm1))])

推荐阅读