R - Сопоставить значения из двух кадров данных на основе нескольких условий (когда порядок поиска идентификаторов является случайным) - PullRequest
0 голосов
/ 28 июня 2018

Привет, у меня есть два кадра данных:

df1 = data.frame(PersonId1=c(1,2,3,4,5,6,7,8,9,10,1),PersonId2=c(11,12,13,14,15,16,17,18,19,20,11),
             Played_together = c(1,0,0,1,1,0,0,0,1,0,1),
             Event=c(1,1,1,1,2,2,2,2,2,2,2),
             Utility=c(20,-2,-5,10,30,2,1,.5,50,-1,60))


df2 = data.frame(PersonId1=c(11,15,9,1),PersonId2=c(1,5,19,11),
             Played_together = c(1,1,1,1),
             Event=c(1,2,2,2))

Где df1 выглядит так:

      PersonId1 PersonId2 Played_together Event Utility
1          1        11               1     1    20.0
2          2        12               0     1    -2.0
3          3        13               0     1    -5.0
4          4        14               1     1    10.0
5          5        15               1     2    30.0
6          6        16               0     2     2.0
7          7        17               0     2     1.0
8          8        18               0     2     0.5
9          9        19               1     2    50.0
10        10        20               0     2    -1.0
11         1        11               1     2    60.0

и df2 выглядит так:

  PersonId1 PersonId2 Played_together Event
1        11         1               1     1
2        15         5               1     2
3         9        19               1     2
4         1        11               1     2   

Обратите внимание, что df2 - это не просто df1 $ plays_together == 1 . (Например, PlayerId1 = 4 и PlayerId2 = 14 отсутствует в df2.

Также обратите внимание, что, хотя df2 является подмножеством df1, порядок появления людей в df2 является случайным. Например, в df1 в строке 1 мы видим playerid1 = 1 и playerId2 = 11 для события 1. Но в df2 в строке 1 мы видим playerid1 = 11 и playerId2 = 1 для Событие 1. Эти два случая абсолютно одинаковы, и я хочу посмотреть значения Utility от df1 до df2 . Слияние должно происходить для каждого события. Окончательный результат должен выглядеть следующим образом:

  PersonId1 PersonId2 Played_together Event Utility
1        11         1               1     1      20
2        15         5               1     2      30
3         9        19               1     2      50
4         1        11               1     2      60

Я знаю, что в R существует функция слияния, но я не знаю, что делать, когда идентификаторы поиска могут отображаться как случайные. Был бы признателен, если кто-то может помочь мне немного. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Решение состоит в том, чтобы создать столбец «Команда», используя комбинацию PersonId1 и PersonId2 таким образом, чтобы он составил min(PersonId) : max(PersonId) для двух команд. Теперь присоединитесь к df1 и df2 на Team и Event, чтобы получить нужные данные.

library(dplyr)


df2 %>% rowwise() %>% 
  mutate(Team = paste0(min(PersonId1,PersonId2), ":",max(PersonId1,PersonId2))) %>%
  inner_join(df1 %>% rowwise() %>% 
               mutate(Team = 
                   paste0(min(PersonId1,PersonId2), ":",max(PersonId1,PersonId2))),
             by = c("Team", "Event")) %>%
  select(PersonId1 = PersonId1.x,  PersonId2 = PersonId2.x,
             Played_together = Played_together.x, Event, Utility) %>%
  as.data.frame()

#   PersonId1 PersonId2 Played_together Event Utility
# 1        11         1               1     1      20
# 2        15         5               1     2      30
# 3         9        19               1     2      50
# 4         1        11               1     2      60
0 голосов
/ 28 июня 2018

Вот что у меня есть для вас:

    library(dplyr)
    rbind(left_join(df2, df1, 
          by = c("PersonId2" = "PersonId1", "PersonId1" = "PersonId2", 
            "Played_together" = "Played_together", "Event" = "Event")),
          left_join(df2, df1, 
                     by = c("PersonId1" = "PersonId1", "PersonId2" = "PersonId2", 
         "Played_together" = "Played_together", "Event" = "Event"))) %>%
          filter(!is.na(Utility))

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

Ваш вывод выглядит так:

    PersonId1 PersonId2 Played_together Event Utility
1        11         1               1     1      20
2        15         5               1     2      30
3         9        19               1     2      50
4         1        11               1     2      60
...