创建对以进行网络分析

时间:2018-12-18 08:33:57

标签: r network-analysis pairing

我正在尝试从数据集中根据排名配对。我的数据看起来像

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

  • 如果rank = 1,则源和目标中的grp相同= grp
  • 如果等级不同于1,则
    • source =从以前的排名中获取grp
    • 目的地=从当前等级中获取组 如果存在多个组用于同一排名,则需要另外创建一行,以便代表每一对。

然后看起来像下面的

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语句开始,但是被卡住了。任何帮助表示赞赏!提前谢谢。

1 个答案:

答案 0 :(得分:1)

我们可以执行以下操作:

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分组,然后在每行上进行给定的分组。然后,根据您的规则,为每一行构造一个新的数据框。