我试图计算一个双模网络数据的雅卡系数。
我的数据如下所示:
df <- data.frame(patent = c("A", "B", "B", "C", "C", "C"),
class = c("X", "Y", "Z", "X", "Y", "Z"))
node_list <-
df %>%
select(class) %>% distinct(class)
edge_list <- as.data.frame(t(combn(node_list,2)))
edge_list$no_patents_V1 <- NA
edge_list$no_patents_V2 <- NA
edge_list$no_patents_V1_V2 <- NA
edge_list$no_patents_V1_nV2 <- NA
我需要计算边权重。我的边权重是:我需要找出有多少专利属于1类和2类,1类但不是2类,2类但不是1类,然后我计算jaccard系数为a/a+b+c。
我还需要多少专利属于每个独特的类别总数。
我尝试了以下代码:
`for(k in 1:nrow(edge_list)){
edge_list[k,"no_patents_V1"] <-
df%>%
filter(str_detect(classes, edge_list[k,1])) %>%
nrow()
edge_list[k,"no_patents_V2"] <-
df%>%
filter(str_detect(classes, edge_list[k,2])) %>%
nrow()
edge_list[k,"no_patents_V1_V2"] <-
df%>%
filter(str_detect(classes, edge_list[k,1])) %>%
filter(str_detect(classes, edge_list[k,2])) %>%
nrow()
edge_list[k,"no_patents_V1_nV2"] <-
df%>%
filter(str_detect(classes, edge_list[k,1])) %>%
filter(!str_detect(classes, edge_list[k,2])) %>%
nrow()
edge_list[k,"no_patents_V2_nV1"] <-
df%>%
filter(str_detect(classes, edge_list[k,2])) %>%
filter(!str_detect(classes, edge_list[k,1])) %>%
nrow()
}
`
我总共有30个类,因此在边列表中有435行。这是超级低效的。你能建议一些有效的方法来解决这个问题吗?
我总共有大约一百万项专利。
1条答案
按热度按时间qlzsbp2j1#
这可能是你正在寻找的,在基础R中完成。创建数据:
请注意,原始代码在创建边列表时返回错误。循环
edge_list
中的每一行:我们使用
intersect
和setdiff
的集合比较来简化任务,不需要寻找字符串。我通常不喜欢for循环,但在这种情况下应该足够了。如果没有,你可以把它放到sapply
调用中。输出:Add-on:对于真正大的数据集,我们可以使用
future.apply
并行化,并将代码封装在future_sapply
调用中。给定一个包含500万行和435个两个类的唯一组合的大型data.frame
:使用
future_sapply
:微基准测试: