создание пар для сетевого анализа - PullRequest
0 голосов
/ 18 декабря 2018

Из моего набора данных я пытаюсь составить пары на основе рейтинга.мои данные выглядят так:

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  

Вывод, к которому я стремлюсь, следующий: для каждого идентификатора

  • , если rank = 1, тогда grp в источнике и пункте назначения одинаковы = grp
  • Если ранг отличается от 1, то
    • source = взять группу из предыдущего ранга
    • destination = взять группу из текущего ранга Если для одного ранга существует более одной группы, тонеобходимо создать дополнительную строку, чтобы каждая пара была представлена.

В таком случае это выглядит следующим образом:

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 голосов
/ 18 декабря 2018

Мы можем сделать следующее:

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, а затем перебираем каждую строку данной группы.Затем для каждой строки мы создаем новый фрейм данных в соответствии с вашими правилами.

...