R语言 从测量输出生成邻接矩阵

5uzkadbs  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(129)

我正在尝试从Excel中提取数据,格式如下:
| 调查对象|艾比|布兰登|简|玛丽|帕特|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 简|1| 0| 0| 1| 0|
| 帕特|0| 0| 1| 1| 0|
其中1表示调查受访者认识该列中的人,0表示调查受访者不认识该列中的人。
我想创建两个矩阵,它们的形式为(其中数字代表人)
| | 1| 2| 3| 4| 5个|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 1| 0| 0| 1| 0| 0|
| 2| 0| 0| 0| 0| 0|
| 3| 1| 0| 0| 1| 0|
| 4| 0| 0| 1| 0| 1|
| 5个|0| 0| 1| 1| 0|
然后呢
| ID|名称|
| - -----|- -----|
| 1|艾比|
| 2|布兰登|
| 3|简|
| 4|玛丽|
| 5个|帕特|
我已经在Matlab中完成了这一点,但由于网络分析是在R中完成的,所以我宁愿在R中完成。
我是R的新手,所以我试图通过从初始矩阵创建一个新矩阵来实现这一点,但在矩阵维度方面遇到了麻烦。并且不确定除了创建行和列标签之外如何包括0和1数据。

ldfqzlk8

ldfqzlk81#

如果您想查看网络/图形数据,igraph包可以提供帮助。以下是转换数据后如何使用它

library(dplyr)
library(tidyr)
library(igraph)

#sample data
dd <- data.frame(
  SurveyRespondents = c("Jane", "Pat"), 
    Abby = 1:0, Brandon = c(0L, 0L), Jane = 0:1, 
    Mary = c(1L, 1L), Pat = c(0L, 0L))

people <- sort(unique(c(dd$SurveyRespondents, names(dd)[-1])))
dd %>% 
  pivot_longer(-SurveyRespondents) %>% 
  filter(value==1) %>% 
  select(-value) %>% 
  graph_from_data_frame(., directed=FALSE, vertices = people) %>% 
  as_adjacency_matrix()

#         Abby Brandon Jane Mary Pat
# Abby       .       .    1    .   .
# Brandon    .       .    .    .   .
# Jane       1       .    .    1   1
# Mary       .       .    1    .   1
# Pat        .       .    1    1   .

igraph还可以轻松绘制数据x1c 0d1x

yx2lnoni

yx2lnoni2#

Base R

您可以使用以下基R选项

v <- as.matrix(df[-1][match(names(df)[-1], df$SurveyRespondents), ])
u <- `rownames<-`(replace(v, is.na(v), 0), colnames(v))
pmax(u, t(u))

你将获得

Abby Brandon Jane Mary Pat
Abby       0       0    1    0   0
Brandon    0       0    0    0   0
Jane       1       0    0    1   1
Mary       0       0    1    0   1
Pat        0       0    1    1   0

igraph

使用igraph,我们可以尝试

`row.names<-`(as.matrix(df[-1]), df$SurveyRespondents) %>%
    as.data.frame.table() %>%
    filter(Freq > 0) %>%
    graph_from_data_frame(directed = FALSE, vertices = names(df)[-1]) %>%
    as_adjacency_matrix(sparse = FALSE)

它给出了

Abby Brandon Jane Mary Pat
Abby       0       0    1    0   0
Brandon    0       0    0    0   0
Jane       1       0    0    1   1
Mary       0       0    1    0   1
Pat        0       0    1    1   0

相关问题