如何生成一组个体与一个个体相关联次数的原始计数?
How do I generate a raw count of how many times a set of individuals is connected to an individual?
假设我有以下数据集:
name1 <- c("John", "Mary", "Anne", "Joe", "David")
name2 <- c("Mary", "John", "Linda", "David", "Joe")
df <- data.frame(name1, name2)
> df
name1 name2
1 John Mary
2 Mary John
3 Anne Linda
4 Joe David
5 David Joe
name3 <- c("Kate", "Kate", "Kate", "Roger", "Roger", "Patty", "Patty")
name4 <- c("Mary", "John", "Bob", "David", "Joe", "Anne", "Linda")
df2 <- data.frame(name3, name4)
> df2
name3 name4
1 Kate Mary
2 Kate John
3 Kate Bob
4 Roger David
5 Roger Joe
6 Patty Anne
7 Patty Linda
名称相互配对时被视为“集合”。所以“John & Mary”是一对,因为还有“Mary & John”。
我想看看 df 中的每一对(John & Mary 和 Joe & David)与 df2 中的个体有多少次联系。所以在这个玩具示例中,John 和 Mary 都与 Kate 相关联,而 David 和 Joe 都与 Roger 相关联。如果约翰和玛丽也与罗杰有联系,他们将是一个人的两次集合,所以在次数下,它将是“2”。
对于当前的 dfs,我想要一个 table 显示:
Pair No. of times
John – Mary 1
Roger – Joe 1
有一些社交网络软件包可以直观地显示这些人的联系方式,但我只是在寻找一个简单的 table 来显示计数。
这是一个使用 igraph
包的方法。首先,我们从主 data.frame 创建一个图形,保持“集合”(那些由多个节点边连接的顶点)。然后我们通过给它们一个边缘属性“main”来标记那些是我们感兴趣的。然后我们将这些与其余数据结合起来。
gg1 <- graph_from_data_frame(df, directed = FALSE)
gg1 <- delete_edges(gg1, which(!which_multiple(gg1)))
E(gg1)$main <- TRUE
gg2 <- graph_from_data_frame(df2, directed = FALSE)
ggfull <- union(gg1, gg2)
# (optional) preview results
E(ggfull)$color <- ifelse(!is.na(E(ggfull)$main), "red", "grey")
plot(ggfull)
现在这里有一个辅助函数,它将遍历图形并找到其中一条边来自“主”集的所有“三角形”。
find_main_trios <- function(g) {
tricnt <- numeric(gsize(g))
triset <- triangles(g)
for(i in seq(1, length(triset), by=3)) {
edges <- c(
E(g)[triset[i]%--%triset[i+1]],
E(g)[triset[i+1]%--%triset[i+2]],
E(g)[triset[i]%--%triset[i+2]]
)
for (edge in edges)
if (!is.na(E(g)[edge]$main)) {
tricnt[edge] = tricnt[edge] + 1
}
}
do.call("rbind", lapply(which(tricnt>0), function(i) {
names <- V(g)[inc(i)]$name
data.frame(name1=names[1], name2=names[2], count=tricnt[i], edgeid=i)
}))
}
大部分工作都是由 triangles()
函数完成的,该函数查找所有相互连接的三个节点的集合。然后我们需要确保每个三角形都包含我们感兴趣的第一个 data.frame 中的一个集合。函数的最后一个出价只是将所有内容都整理成 data.frame。所以当我们 运行 我们得到
find_main_trios(ggfull)
# name1 name2 count edgeid
# 1 Joe David 1 5
# 2 John Mary 1 9
这给出了您想要的摘要。
假设我有以下数据集:
name1 <- c("John", "Mary", "Anne", "Joe", "David")
name2 <- c("Mary", "John", "Linda", "David", "Joe")
df <- data.frame(name1, name2)
> df
name1 name2
1 John Mary
2 Mary John
3 Anne Linda
4 Joe David
5 David Joe
name3 <- c("Kate", "Kate", "Kate", "Roger", "Roger", "Patty", "Patty")
name4 <- c("Mary", "John", "Bob", "David", "Joe", "Anne", "Linda")
df2 <- data.frame(name3, name4)
> df2
name3 name4
1 Kate Mary
2 Kate John
3 Kate Bob
4 Roger David
5 Roger Joe
6 Patty Anne
7 Patty Linda
名称相互配对时被视为“集合”。所以“John & Mary”是一对,因为还有“Mary & John”。
我想看看 df 中的每一对(John & Mary 和 Joe & David)与 df2 中的个体有多少次联系。所以在这个玩具示例中,John 和 Mary 都与 Kate 相关联,而 David 和 Joe 都与 Roger 相关联。如果约翰和玛丽也与罗杰有联系,他们将是一个人的两次集合,所以在次数下,它将是“2”。
对于当前的 dfs,我想要一个 table 显示:
Pair No. of times
John – Mary 1
Roger – Joe 1
有一些社交网络软件包可以直观地显示这些人的联系方式,但我只是在寻找一个简单的 table 来显示计数。
这是一个使用 igraph
包的方法。首先,我们从主 data.frame 创建一个图形,保持“集合”(那些由多个节点边连接的顶点)。然后我们通过给它们一个边缘属性“main”来标记那些是我们感兴趣的。然后我们将这些与其余数据结合起来。
gg1 <- graph_from_data_frame(df, directed = FALSE)
gg1 <- delete_edges(gg1, which(!which_multiple(gg1)))
E(gg1)$main <- TRUE
gg2 <- graph_from_data_frame(df2, directed = FALSE)
ggfull <- union(gg1, gg2)
# (optional) preview results
E(ggfull)$color <- ifelse(!is.na(E(ggfull)$main), "red", "grey")
plot(ggfull)
现在这里有一个辅助函数,它将遍历图形并找到其中一条边来自“主”集的所有“三角形”。
find_main_trios <- function(g) {
tricnt <- numeric(gsize(g))
triset <- triangles(g)
for(i in seq(1, length(triset), by=3)) {
edges <- c(
E(g)[triset[i]%--%triset[i+1]],
E(g)[triset[i+1]%--%triset[i+2]],
E(g)[triset[i]%--%triset[i+2]]
)
for (edge in edges)
if (!is.na(E(g)[edge]$main)) {
tricnt[edge] = tricnt[edge] + 1
}
}
do.call("rbind", lapply(which(tricnt>0), function(i) {
names <- V(g)[inc(i)]$name
data.frame(name1=names[1], name2=names[2], count=tricnt[i], edgeid=i)
}))
}
大部分工作都是由 triangles()
函数完成的,该函数查找所有相互连接的三个节点的集合。然后我们需要确保每个三角形都包含我们感兴趣的第一个 data.frame 中的一个集合。函数的最后一个出价只是将所有内容都整理成 data.frame。所以当我们 运行 我们得到
find_main_trios(ggfull)
# name1 name2 count edgeid
# 1 Joe David 1 5
# 2 John Mary 1 9
这给出了您想要的摘要。