Как заменить значения по ссылке в столбце на R? - PullRequest
0 голосов
/ 21 февраля 2019

Любой игрок в диапазоне от 1 до 8 называется «Вперед», а между 9–15 - «Назад», но эти игроки могут быть заменены на другого с номером больше 15, и этот новый игрок должен сохранять тот же статус («Вперед» или «Назад»).,Итак, как я могу присвоить этот статус кодификации по ссылке?Пример

data.frame(Player_substituted=c(7,  15,  2,  1,  8,  5, 22, 18),
            Player_substitute=c(22, 18, 16, 17, 20, 19, 21, 23)
            )
#Table
  Player_substituted Player_substitute
                  7                22
                  15               18
                  2                16
                  1                17
                  8                20
                  5                19
                 22                21
                 18                23

И идея состоит в том, чтобы иметь вывод наподобие:

 Player_substituted Player_substitute status_P_sustituted
                  7                22             Forward
                  15               18             Backward
                  2                16             Forward
                  1                17             Forward
                  8                20             Forward
                  5                19             Forward
                 22                21             Forward
                 18                23             Backward

Это означает, например, что игрок 7 - «Вперед» и его заменил игрок 22так что игрок 22 тоже «вперед».Но игрок 15 «Назад», и он был заменен игроком 18, поэтому игрок 18 также «Назад»

. Один из вариантов - использовать функции which () для определения индекса (это только черновик)

#To find index of user with number higher than 15
Index<-which(!Player_substituted%in%1:15)
#To find the user susituted
Index_2<-which(Player_substitute==Player_substituted[Index])
....

Конечно, это не самый эффективный способ.Кроме того, мне нужно сделать эту группировку по другим переменным.Любое предложение?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

По сути, вы хотите построить цепочку замен и назначить значение членам цепочки на основе первого игрока в цепочке.Мы можем использовать пакет igraph для построения цепочки подстановок, чтобы затем мы могли назначить правильное значение для последующих подстановок.

library(igraph)
library(dplyr)

df <- data.frame(Player_substituted=c(7,  15,  2,  1,  8,  5, 22, 18),
                 Player_substitute=c(22, 18, 16, 17, 20, 19, 21, 23))

# Generate edges for igraph
edges <- as.character(as.vector(t(df)))

# Generate igraph object
g <- graph(edges)

# Get cluster membership
memb <- clusters(g)$membership

data.frame(Player_substitute = as.numeric(names(memb)), group_id = memb) %>%
  group_by(group_id) %>%
  mutate(status_P_substituted = if_else(first(Player_substitute) < 9, "Forward", "Backward")) %>%
  ungroup() %>%
  right_join(df, by = "Player_substitute") %>%
  select(Player_substituted, Player_substitute, status_P_substituted)


  Player_substituted Player_substitute status_P_substituted
               <dbl>             <dbl> <chr>               
1                  7                22 Forward             
2                 15                18 Backward            
3                  2                16 Forward             
4                  1                17 Forward             
5                  8                20 Forward             
6                  5                19 Forward             
7                 22                21 Forward             
8                 18                23 Backward   
0 голосов
/ 21 февраля 2019
  1. Вы должны сохранить объект вашего фрейма данных:

    dat<-data.frame(Player_substituted=c(7, 15, 2, 1, 8, 5, 22, 18) Player_substitute=c(22, 18, 16, 17, 20, 19, 21, 23))

  2. Теперь вы можете и значения в новомстолбец

    dat$Player_Substitued<-ifelse(dat$Player_substituted < 9, "Forward", "Backward")

С помощью «$» вы добавляете новый столбец в объект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...