为网络分析创建对

creating pairs for network analysis

从我的数据集中,我试图根据排名进行配对。我的数据看起来像

ID     grp      rank
1      grp1       1
1      grp2       1
1      grp3       2
2      grp1       1
2      grp2       2
2      grp2       2
2      grp2       2
2      grp3       2
2      grp1       3  

我的目标输出如下: 对于每个 ID

这看起来像下面这样

ID     rank     source  destination
 1       1       grp1        grp1
 1       1       grp2        grp2
 1       2       grp1        grp3
 1       2       grp2        grp3
 2       1       grp1        grp1
 2       2       grp1        grp2 
 2       2       grp1        grp2
 2       2       grp1        grp2
 2       2       grp1        grp3
 2       3       grp2        grp1
 2       3       grp3        grp1

我从 for 循环和 if_else 语句开始,但我卡住了。任何帮助表示赞赏!提前谢谢。

我们可能会做以下事情:

df %>% group_by(ID) %>% 
  do(map_dfr(1:nrow(.), function(i)
    data.frame(.[i, -2], source = if(.$rank[i] == 1) .$grp[i] else unique(.$grp[.$rank == .$rank[i] - 1]), 
               destination = .$grp[i])))
# A tibble: 11 x 4
# Groups:   ID [2]
#       ID  rank source destination
#    <int> <int> <fct>  <fct>      
#  1     1     1 grp1   grp1       
#  2     1     1 grp2   grp2       
#  3     1     2 grp1   grp3       
#  4     1     2 grp2   grp3       
#  5     2     1 grp1   grp1       
#  6     2     2 grp1   grp2       
#  7     2     2 grp1   grp2       
#  8     2     2 grp1   grp2       
#  9     2     2 grp1   grp3       
# 10     2     3 grp2   grp1       
# 11     2     3 grp3   grp1 

我们按 ID 分组,然后遍历给定组的每一行。然后我们根据您的规则为每一行构建一个新的数据框。