r - 如何检查数据帧之间行元素的相似性
问题描述
我有多个数据框,每个数据框有 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。
如果有更合适的方法可以做到这一点,请赐教。谢谢你的指点。
解决方案
我们可以通过两个数据中的成员身份将 ID 拆分list
为vector
idlist1 <- with(df1, split(ID, membership))
idlist2 <- with(df2, split(ID, membership))
然后,创建一个命名的隶属向量来匹配 other 中的隶属关系,根据 对列表元素进行排序match
并使用它Map
来获取intersect
ID 的对应元素
nm1 <- setNames(as.character(1:5), 0:4)
Map(intersect, idlist1, idlist2[match(names(idlist2), names(nm1))])
推荐阅读
- c# - 无法加载文件或程序集“System.Web.Mvc,版本=4.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”
- php - Tricky Laravel 6 版本情况 - 版本号不清楚
- python - 通过 saved_objects api 导出导入 Kibana [7.4] 对象
- c# - SharpGL WPF 从不使用 OpenGLDraw 的代码中绘制
- data-structures - 如何在快速联合操作中选择元素?
- reactjs - 在 react-native 中运行应用程序时出错
- dart - Dart 语言返回 void 方法
- c++ - 为什么程序不能正确计算值?
- sas - 删除 A || 的重复项 B 等于 B || 一个
- mysql - 尝试创建关系时出错:外键约束的格式不正确 - MariaDB