我有一个数据框df
structure(list(X = 1:12, id = structure(c(2L, 7L, 5L, 4L, 3L,
1L, 6L, 8L, 9L, 10L, 11L, 12L), .Label = c("B12", "B7", "C2",
"C9", "D3", "E2", "E6", "R4", "T2", "T3", "T7", "U9"), class = "factor"),
age = c(42L, 45L, 83L, 59L, 49L, 46L, 52L, 23L, 24L, 25L,
26L, 27L)), class = "data.frame", row.names = c(NA, -12L))
我已经在上面的数据帧的人分成称为3点矩阵的列表list_mat
list(Blue_Banana = structure(c("B7", "E6", "D3", "C9"), .Dim = c(2L,
2L), .Dimnames = list(NULL, c("target", "partner"))), Gold_Apple = structure(c("C2",
"B12", "E2", "R4"), .Dim = c(2L, 2L), .Dimnames = list(NULL,
c("target", "partner"))), Blue_Orange = structure(c("T2",
"T3", "T7", "U9"), .Dim = c(2L, 2L), .Dimnames = list(NULL, c("target",
"partner"))))
我想组基于关键字,其中可以与发现它们的基质的对象的名称的矩阵
names(list_mat)
然后我使用igraph
包中的函数来计算度数
list_graph= lapply(list_mat, graph_from_edgelist, directed=TRUE)
cent_list= lapply(list_graph, centr_degree, mode="in")
要获得实际的中度分数我将使用第一矩阵对象内部list_mat
作为一个例子
cent_list[[1]]$res
要再次获得学位分数参考的ID,我将再次使用list_mat
中的第一个矩阵作为示例
V(list_graph[[1]])$name
我希望list_mat
中矩阵中名称中包含字符串“ Blue”的所有值的度内分数与原始数据帧df
中的ID匹配,并且将创建一个名为“蓝色”的列,其中包含这些矩阵中ID的入度分数。然后,我想对list_mat
中矩阵对象名称中所有带有“ Gold”的矩阵做同样的事情(名称中只有一个矩阵带有“ Gold”),最终输出看起来像画面的底部,但数字可以是不同的。
答案 0 :(得分:2)
很显然,有多种方法可以实现这一目标;这是一个。首先,
(blues <- grep("Blue", names(list_graph)))
# [1] 1 3
确定哪些图形与“蓝色”有关。然后
(db <- degree(Reduce(`+`, list_graph[blues]), mode = "in"))
# B7 D3 E6 C9 T2 T7 T3 U9
# 0 1 0 1 0 1 0 1
(do <- degree(Reduce(`+`, list_graph[-blues]), mode = "in"))
# C2 E2 B12 R4
# 0 1 0 1
是两组的度数。要将其插入到df
中,我们可以像这样使用基数R的merge
merge(merge(df, data.frame(Blue = db), by.x = "id", by.y = "row.names", all.x = TRUE),
data.frame(Gold = do), by.x = "id", by.y = "row.names", all.x = TRUE)
# id X age Blue Gold
# 1 B12 6 46 NA 0
# 2 B7 1 42 0 NA
# 3 C2 5 49 NA 0
# 4 C9 4 59 1 NA
# 5 D3 3 83 1 NA
# 6 E2 7 52 NA 1
# 7 E6 2 45 0 NA
# 8 R4 8 23 NA 1
# 9 T2 9 24 0 NA
# 10 T3 10 25 0 NA
# 11 T7 11 26 1 NA
# 12 U9 12 27 1 NA
给出NA的结果,但实际上可能更合适,因为以这种方式可以清楚地知道该行属于哪个组。否则,例如在第9行和第10行中,将不清楚。
更一般地说,我们可以做
keywords <- c("Blue", "Gold", "Red", "Purple") # Assuming all those are present
for(k in keywords) {
idx <- grep(k, names(list_graph))
deg <- degree(Reduce(`+`, list_graph[idx]), mode = "in")
df <- merge(df, data.frame(deg), by.x = "id", by.y = "row.names", all.x = TRUE)
names(df)[ncol(df)] <- k
}
一个值得解释的部分是
Reduce(`+`, list_graph[idx])
我首先合并图表,而不是合并来自不同图表的不同“蓝色”度,如g1 + g2
(是的,它可以工作),其中得到的图表具有两个成分g1
和{{1 }},然后计算此超图的度数。现在g2
允许以这种方式来总结任何数量的曲线图,即,它确实Reduce
在所有图形g1 + g2 + ... + gk
。