是否有R函数来获取无向(非定向)网络中的唯一边缘?

问题描述 投票:4回答:2

我想计算无向网络中唯一边的数量,例如net

   x  y
1  A  B
2  B  A
3  A  B

该矩阵应该只有一个唯一的边缘,因为边界A-B和B-A对于无向网络是相同的。

对于定向网络,我可以通过以下方式获得唯一边数:

nrow(唯一的(净[,C( “X”, “Y”]))

但这对于无向网络不起作用。

r edges
2个回答
2
投票

鉴于您正在使用网络,igraph解决方案:

library(igraph)

as_data_frame(simplify(graph_from_data_frame(dat, directed=FALSE)))

然后使用nrow


说明

dat %>% 
  graph_from_data_frame(., directed=FALSE) %>% # convert to undirected graph
  simplify %>%                                 # remove loops / multiple edges
  as_data_frame                                # return remaining edges

1
投票

试试这个,

df <- data.frame(x=c("A", "B", "A"), y = c("B", "A", "B"))
unique(apply(df, 1, function(x) paste(sort(unlist(strsplit(x, " "))),collapse = " ")))
[1] "A B"

那么这是如何工作的呢?

  1. 我们将一个函数应用于数据框的每一行,因此我们可以一次取每行。拿df的第二行, df[2,] x y 1 B A
  2. 然后我们将(strsplit)这个和unlist分成每个字母的向量,(我们使用as.matrix来隔离元素) unlist(strsplit(as.matrix(df[2,]), " ")) [1] "B" "A"
  3. 使用sort函数按字母顺序排列,然后将它们粘贴在一起, paste(sort(unlist(strsplit(as.matrix(df[2,]), " "))), collapse = " ") [1] "A B"

然后apply函数对所有行执行此操作,因为我们将索引设置为1,然后使用unique函数来标识唯一的边。

延期

这可以扩展到n个变量,例如n = 3,

df <- data.frame(x=c("A", "B", "A"), y = c("B", "A", "B"),  z = c("C", "D", "D"))
unique(apply(df, 1, function(x) paste(sort(unlist(strsplit(x, " "))),collapse = " ")))
[1] "A B C" "A B D"

如果需要更多字母,只需组合两个字母,如下所示,

df <- data.frame(x=c("A", "BC", "A"), y = c("B", "A", "BC"))
df
   x  y
1  A  B
2 BC  A
3  A BC
unique(apply(df, 1, function(x) paste(sort(unlist(strsplit(x, " "))),collapse = " ")))
[1] "A B"  "A BC"

旧版

使用tidyverse包,创建一个名为rev的函数,可以对我们的边进行排序,然后使用mutate创建一个组合x和y列的新列,这样它可以很好地与rev函数配合使用,然后运行新列通过功能并找到唯一的对。

library(tidyverse)
rev <- function(x){
  unname(sapply(x, function(x) {
    paste(sort(trimws(strsplit(x[1], ',')[[1]])), collapse=',')} ))
}
df <- data.frame(x=c("A", "B", "A"), y = c("B", "A", "B"))
rows <- df %>% 
  mutate(both = c(paste(x, y, sep = ", ")))

unique(rev(rows$both))
© www.soinside.com 2019 - 2024. All rights reserved.