通过列表对象名称合并数据框列表

时间:2019-02-01 17:46:01

标签: r matrix igraph

我有一个数据框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”),最终输出看起来像画面的底部,但数字可以是不同的。

<code>enter image description here</code>

1 个答案:

答案 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