基于DataFrame构建Pattern相等时的无向邻接矩阵(值累加)
问题描述
我有如下DataFrame:
mydf <- data.frame(Country=c('USA','Brazil','China','Italy','Ghana','Brazil','USA','China','USA'), Pattern=c('XXZ','XXX','XYX','XXZ','XXX','XXX','XYZ','XXX','XYZ'), Value=c(1,2,5,4,1,2,3,1,6))
需要构建一个无向邻接矩阵,要求仅当Pattern列取值相同时进行匹配,且对应Value值进行累加。示例输出如下:
From To Pattern Value Brazil Brazil XXX 4 Brazil China XXX 3 Brazil Ghana XXX 3
解决方案
可以借助dplyr和tidyr包,通过分组配对、关联原数据、聚合计算实现需求,代码如下:
library(dplyr) library(tidyr) result <- mydf %>% # 按Pattern分组,确保同规则内的国家才会匹配 group_by(Pattern) %>% # 生成组内所有国家的无向配对(包含自身配对) expand(From = Country, To = Country) %>% # 关联原表获取配对双方的Value值 left_join(mydf, by = c("Pattern", "From" = "Country")) %>% left_join(mydf, by = c("Pattern", "To" = "Country")) %>% # 计算配对的Value累加和 mutate(Value = Value.x + Value.y) %>% # 筛选保留无向图的唯一组合(避免A-B和B-A重复) filter(From <= To) %>% # 整理输出列并排序 select(From, To, Pattern, Value) %>% arrange(Pattern, From) %>% ungroup() # 查看最终结果 print(result)
结果说明
运行代码后会得到符合要求的无向邻接表:
- 仅同
Pattern的国家之间生成配对 - 国家自身配对的
Value为自身对应值的2倍(如示例中Brazil的XXX组Value=2+2=4) - 不同国家配对的
Value为双方对应值的和(如示例中Brazil和China的XXX组Value=2+1=3)
内容的提问来源于stack exchange,提问作者Discovery2020
相关产品推荐
相关产品推荐

