r - 在R中制作邻接矩阵
问题描述
我想从一个mydata
包含几行的数据框()中创建一个邻接矩阵,并遵循以下规则:
- 将所有字母列为方阵
- 从对应行的
source
其余列 ( )计算和求和连接数。p1 p2 p3 p4 p5
例如,b
与a
(2 和 8 行)连接 5 次。 - 如果字母不包含在 中
source
,则连接值应为零。
数据框是:
mydf <- data.frame(p1=c('a','a','a','b','g','b','c','c','d'),
p2=c('b','c','d','c','d','e','d','e','e'),
p3=c('a','a','c','c','d','d','d','a','a'),
p4=c('a','a','b','c','c','e','d','a','b'),
p5=c('a','b','c','d','I','b','b','c','z'),
source=c('a','b','c','d','e','e','a','b','d'))
邻接矩阵应该如下
a b c d e g I z
a 4 2 1 3 0 0 0 0
b 5 1 3 0 1 0 0 0
c 1 1 2 1 0 0 0 0
d 1 2 3 2 1 0 0 1
e 0 2 1 3 2 1 1 0
g 0 0 0 0 0 0 0 0
I 0 0 0 0 0 0 0 0
z 0 0 0 0 0 0 0 0
我有数百列和数千行。我希望有任何最快的方法在 R 中做到这一点
解决方案
在基础 R 中,我们可以使用table
:
vals <- unlist(mydf[-ncol(mydf)])
table(factor(rep(mydf$source, ncol(mydf) - 1), levels = unique(vals)), vals)
# vals
# a b c d e g I z
# a 4 2 1 3 0 0 0 0
# b 5 1 3 0 1 0 0 0
# g 0 0 0 0 0 0 0 0
# c 1 1 2 1 0 0 0 0
# d 1 2 3 2 1 0 0 1
# e 0 2 1 3 2 1 1 0
# I 0 0 0 0 0 0 0 0
# z 0 0 0 0 0 0 0 0
我们tidyverse
可以这样做:
library(dplyr)
library(tidyr)
mydf %>%
pivot_longer(cols = -source) %>%
count(source, value) %>%
pivot_wider(names_from = value, values_from = n) %>%
complete(source = names(.)[-1]) %>%
mutate_all(~replace_na(., 0))
推荐阅读
- python - 在 Python 中解析 GATE 文档的 TextWithNodes 元素
- r - 根据其他列中的某些值添加具有升序数字开始和结束的列
- swift - 如何通过新尝试获取下载进度 await URLSession.shared.download(...)
- android - 滚动到任何大于 1 的布局时,Horizontal Recyclerview 失去焦点
- sql - 从表中显示每个出版商的最新出版书籍的查询
- vb.net - 页面上的 WebBrowser 控件链接调用 javascript
- r - 将函数应用于列表的各个部分
- tinymce - 在 Next.js 中实现 tinyMce
- javascript - 根据按钮单击事件分配值
- oracle - 不使用替换功能从查询中删除特殊字符