【发布时间】:2021-04-03 20:00:03
【问题描述】:
我有多个数据框,每个数据框有 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 在同一个簇中,则 df1 中的簇 1 在 df2 中检查时只有 75% 完好。
因此,该过程将通过较短 df 中的成员资格(例如 5 个)将样本识别成组,然后查看有多少样本保持在一起,例如 4。那么相似度将是 4/5。
如果有更合适的方法可以做到这一点,请赐教。谢谢指点。
【问题讨论】:
-
你能显示预期的输出吗
-
嗨@akrun 很抱歉你看到我对什么可能是理想的输出一无所知。我会尝试一些东西并更新帖子。对此感到抱歉
-
你要
Map(intersect, with(df1, split(ID, membership)), with(df2, split(ID, membership))) -
哇,这是一个非常棒的输出! @akrun 你能解释一下代码吗?我猜它正在寻找 df1 和 df2 之间的相交行。但我不太确定 Map ( ) 是如何工作的。输出很棒,因为它返回的实际样本保持在一起
-
这里面有问题。第二个数据中的“成员资格”从 0 到 4 开始,而第一个数据中的“成员”是 1:5。
split返回每个成员的 ID 列表(在两个数据中)。然后,我们得到对应列表元素的交集(假设0映射到其他的1,同样是4到5)
标签: r similarity