使用R简单转换为edgelist?

使用R简单转换为edgelist?,r,igraph,data-conversion,edges,R,Igraph,Data Conversion,Edges,我需要在R中做一个简单的数据转换,以便与igraph一起使用。我的数据帧采用这种格式,按GROUP分组: A GROUP 1 1 a 2 2 a 3 3 a 4 4 a 5 1 b 6 3 b 7 5 b 1.如何扩展组以获得此格式的无向edgelistel? 注:无自参考1-1、2-2、3-3、 2.如何计算A-B出现次数并从el创建加权边列表? 以下是使用plyr获取

我需要在R中做一个简单的数据转换,以便与igraph一起使用。我的数据帧采用这种格式,按
GROUP
分组:

    A   GROUP
1   1       a
2   2       a
3   3       a
4   4       a
5   1       b
6   3       b
7   5       b
1.如何扩展组以获得此格式的无向edgelist
el
? 注:无自参考1-1、2-2、3-3、

2.如何计算A-B出现次数并从
el
创建加权边列表?
以下是使用
plyr
获取edgelist的方法:

foo <- data.frame(
  A = c(1,2,3,4,1,3,5),   
  GROUP = c("a","a","a","a","b","b","b"))

library("plyr")

E1 <- do.call(rbind,dlply(foo,.(GROUP),function(x)t(combn(x$A,2))))

E1
然后,为了获得权重(这里我使用
combn
将最小的数字放在第一位):


下面是一个解决方案,我在代码中评论道:

# your data
df <- data.frame(A = c(1, 2, 3, 4, 1, 3, 5),
             GROUP = c("a", "a", "a", "a", "b", "b", "b"))

# define a function returning the edges for a single group
group.edges <- function(x) {
  edges.matrix <- t(combn(x, 2))
  colnames(edges.matrix) <- c("A", "B")
  edges.df <- as.data.frame(edges.matrix)
  return(edges.df)
}

# apply the function above to each group and bind altogether
all.edges <- do.call(rbind, lapply(unstack(df), group.edges))

# add weights
all.edges$weight <- 1
all.edges <- aggregate(weight ~ A + B, all.edges, sum)
all.edges
#   A B weight
# 1 1 2      1
# 2 1 3      2
# 3 2 3      1
# 4 1 4      1
# 5 2 4      1
# 6 3 4      1
# 7 1 5      1
# 8 3 5      1
#您的数据
df
foo <- data.frame(
  A = c(1,2,3,4,1,3,5),   
  GROUP = c("a","a","a","a","b","b","b"))

library("plyr")

E1 <- do.call(rbind,dlply(foo,.(GROUP),function(x)t(combn(x$A,2))))

E1
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    2    3
 [5,]    2    4
 [6,]    3    4
 [7,]    1    3
 [8,]    1    5
 [9,]    3    5
W <- apply(E1,1,function(x)sum(E1[,1]==x[1]&E1[,2]==x[2]))
E2 <- cbind(E1,weight=W)
E2 <- E2[!duplicated(E2),]

E2
         weight
[1,] 1 2      1
[2,] 1 3      2
[3,] 1 4      1
[4,] 2 3      1
[5,] 2 4      1
[6,] 3 4      1
[7,] 1 5      1
[8,] 3 5      1
# your data
df <- data.frame(A = c(1, 2, 3, 4, 1, 3, 5),
             GROUP = c("a", "a", "a", "a", "b", "b", "b"))

# define a function returning the edges for a single group
group.edges <- function(x) {
  edges.matrix <- t(combn(x, 2))
  colnames(edges.matrix) <- c("A", "B")
  edges.df <- as.data.frame(edges.matrix)
  return(edges.df)
}

# apply the function above to each group and bind altogether
all.edges <- do.call(rbind, lapply(unstack(df), group.edges))

# add weights
all.edges$weight <- 1
all.edges <- aggregate(weight ~ A + B, all.edges, sum)
all.edges
#   A B weight
# 1 1 2      1
# 2 1 3      2
# 3 2 3      1
# 4 1 4      1
# 5 2 4      1
# 6 3 4      1
# 7 1 5      1
# 8 3 5      1