我想计算无向网络中唯一边的数量,例如net
x y
1 A B
2 B A
3 A B
该矩阵应该只有一个唯一的边缘,因为边界A-B和B-A对于无向网络是相同的。
对于定向网络,我可以通过以下方式获得唯一边数:
nrow(唯一的(净[,C( “X”, “Y”]))
但这对于无向网络不起作用。
鉴于您正在使用网络,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
试试这个,
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"
那么这是如何工作的呢?
df[2,]
x y
1 B A
strsplit
)这个和unlist
分成每个字母的向量,(我们使用as.matrix
来隔离元素)
unlist(strsplit(as.matrix(df[2,]), " "))
[1] "B" "A"
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))