我正在尝试使用以下形式的专利数据创建边缘列表:
PatentID InventorIDs CoinventorIDs
1 A ; B C,D,E ; F,G,H,C
2 J ; K ; L M,O ; N ; P, Q
我想要的是下面的边缘清单,显示发明人和专利之间的联系。 (分号分隔与每个主发明人相关的共同发明者):
1 A B
1 A C
1 A D
1 A E
1 B F
1 B G
1 B H
1 B C
2 J K
2 J L
2 J M
2 J O
2 K N
2 L P
2 L Q
使用R中的igraph有没有简单的方法呢?
答案 0 :(得分:0)
我对inventorIds之间的边缘感到困惑。但是,这是一种蛮力函数,你可以按行apply
。 igraph
可能有一种方法,它是一个庞大的库,更好,但是一旦你有了这种形式的数据,转换为igraph
数据结构应该很简单。
请注意,这忽略了主要发明者之间的边缘。
## A function to make the edges for each row
rowFunc <- function(row) {
tmp <- lapply(row[2:3], strsplit, '\\s*;\\s*')
tmp2 <- lapply(tmp[[2]], strsplit, ',')
do.call(rbind, mapply(cbind, row[[1]], unlist(tmp[[1]]), unlist(tmp2, recursive=FALSE)))
}
## Apply the function by row
do.call(rbind, apply(dat, 1, rowFunc))
# [,1] [,2] [,3]
# [1,] "1" "A" "C"
# [2,] "1" "A" "D"
# [3,] "1" "A" "E"
# [4,] "1" "B" "F"
# [5,] "1" "B" "G"
# [6,] "1" "B" "H"
# [7,] "1" "B" "C"
# [8,] "2" "J" "M"
# [9,] "2" "J" "O"
# [10,] "2" "K" "N"
# [11,] "2" "L" "P"
# [12,] "2" "L" " Q"