gpt4 book ai didi

r - 查找配对之间最常见的组合

转载 作者:行者123 更新时间:2023-12-01 09:45:55 25 4
gpt4 key购买 nike

我有一份参加这些事件的事件和客人的名单。像这样,但文件更大:

event       guests
birthday John Doe
birthday Jane Doe
birthday Mark White
wedding John Doe
wedding Jane Doe
wedding Matthew Green
bar mitzvah Janet Black
bar mitzvah John Doe
bar mitzvah Jane Doe
bar mitzvah William Hill
retirement Janet Black
retirement Matthew Green

我想找到一起参加最多事件的两位客人的最常见组合。所以在这个例子中,答案应该是 John DoeJane Doe 一起参加的事件最多,因为他们都参加了三个相同的事件。输出应该是这些对的列表。

我什至从哪里开始?

最佳答案

从社交网络/矩阵代数的角度来看略有不同的方法:

您的数据通过共享成员身份描述个人之间的联系。这是一个从属矩阵,我们可以计算个体 $i$ 和 $j$ 之间的联系矩阵,如下所示:

# Load as a data frame
df <- data.frame(event = c(rep("birthday", 3),
rep("wedding", 3),
rep("bar mitzvah", 4),
rep("retirement", 2)),
guests = c("John Doe", "Jane Doe", "Mark White",
"John Doe", "Jane Doe", "Matthew Green",
"Janet Black", "John Doe", "Jane Doe",
"William Hill", "Janet Black", "Matthew Green"))

# You can represent who attended which event as a matrix
M <- table(df$guests, df$event)
# Now we can compute how many times each individual appeared at an
# event with another with a simple matrix product
admat <- M %*% t(M)
admat


##################Jane Doe Janet Black John Doe Mark White Matthew Green William Hill
#Jane Doe 3 1 3 1 1 1
#Janet Black 1 2 1 0 1 1
#John Doe 3 1 3 1 1 1
#Mark White 1 0 1 1 0 0
#Matthew Green 1 1 1 0 2 0
#William Hill 1 1 1 0 0 1

现在我们要去掉矩阵的对角线(它告诉我们每个人参加了多少事件)和矩阵的两个三角形之一,其中包含冗余信息。

diag(admat) <- 0
admat[upper.tri(admat)] <- 0

现在我们只想转换成您可能喜欢的格式。我将使用 reshape2 库中的 melt 函数。

library(reshape2)
dfmatches <- unique(melt(admat))
# Drop all the zero matches
dfmatches <- dfmatches[dfmatches$value !=0,]
# order it descending
dfmatches <- dfmatches[order(-dfmatches$value),]
dfmatches

# Var1 Var2 value
#3 John Doe Jane Doe 3
#2 Janet Black Jane Doe 1
#4 Mark White Jane Doe 1
#5 Matthew Green Jane Doe 1
#6 William Hill Jane Doe 1
#9 John Doe Janet Black 1
#11 Matthew Green Janet Black 1
#12 William Hill Janet Black 1
#16 Mark White John Doe 1
#17 Matthew Green John Doe 1
#18 William Hill John Doe 1

显然,您可以通过重命名感兴趣的变量等来整理输出。

这种一般方法——我的意思是认识到你的数据描述了一个社交网络——你可能会对进一步分析感兴趣(例如,如果人们参加聚会时有很多同一个人,即使不是彼此)。如果您的数据集真的很大,您可以通过使用稀疏矩阵或通过加载 igraph 包并使用其中的函数来声明社交网络来使矩阵代数更快一些。

关于r - 查找配对之间最常见的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com