2016-08-11 4 views
-1

Извините, я не мог придумать лучшего названия для названия, я очень сильно борюсь с объяснением проблемы под рукой словами, поэтому позвольте мне показать вместо этого вместо примера используется блок данных.R dataframe - используя общее значение в одном столбце, чтобы найти значения в другом столбце

dput(DF) 

structure(list(game_id = c(162044, 162044, 162044, 162044, 162044, 
162044, 162044, 162044, 162044, 162044, 162044, 162044, 162044, 
162044, 162044, 166807, 166807, 166807, 166807, 166807, 166807, 
166807, 166807, 166807, 166807, 166807, 166807, 166807, 166807, 
166807, 166807, 166807, 166807, 166807, 167948, 167948, 167948, 
167948, 167948, 167948, 167948, 167948, 167948, 167948, 167948, 
167948, 167948, 167948, 167948, 167948), team_id = c(108738, 
108738, 108738, 108738, 108738, 108738, 108738, 126351, 126351, 
126351, 126351, 126351, 126351, 126351, 126351, 54161, 54161, 
54161, 54161, 54161, 54161, 54161, 54161, 133418, 133418, 133418, 
133418, 133418, 133418, 133418, 133418, 133418, 54161, 54161, 
54161, 54161, 54161, 54161, 54161, 54161, 54161, 135796, 135796, 
135796, 135796, 135796, 135796, 135796, 135796, 135796)), .Names = c("game_id", 
"team_id"), row.names = c(NA, 50L), class = "data.frame") 


head(DF) 

    game_id team_id 
1 162044 108738 
2 162044 108738 
3 162044 108738 
4 162044 108738 
5 162044 108738 
6 162044 108738 
7 162044 108738 
8 162044 126351 
9 162044 126351 
10 162044 126351 
11 162044 126351 
12 162044 126351 
13 162044 126351 
14 162044 126351 
15 162044 126351 
16 166807 54161 
17 166807 54161 
18 166807 54161 
19 166807 54161 
20 166807 54161 
21 166807 54161 
22 166807 54161 
23 166807 54161 
24 166807 133418 
25 166807 133418 
26 166807 133418 
27 166807 133418 
28 166807 133418 
29 166807 133418 
30 166807 133418 
31 166807 133418 
32 166807 133418 
33 166807 54161 
34 166807 54161 
35 167948 54161 
36 167948 54161 
37 167948 54161 
38 167948 54161 
39 167948 54161 
40 167948 54161 
41 167948 54161 
42 167948 135796 
43 167948 135796 
44 167948 135796 
45 167948 135796 
46 167948 135796 
47 167948 135796 
48 167948 135796 
49 167948 135796 
50 167948 135796 

Это ядро ​​данных, с которым я работаю. Важное значение имеет тот факт, что для каждой игры_ид есть две команды. Если это помогает в решении проблемы, все файлы будут отсортированы, а team_ids могут быть сгруппированы таким образом, чтобы для каждого game_id появлялись все экземпляры первого командного_ид, затем появлялись все экземпляры второго team_id (в настоящее время это не так, поскольку вы можете видеть в строках 33 и 34). Мне нужно создать третий столбец, называемый team2_id, где в этом столбце находятся другие team_ids, соответствующие game_id. Пример желаемого выхода ниже:

head(DF) 

    game_id team_id team2_id 
1 162044 108738 126351 
2 162044 108738 126351 
3 162044 108738 126351 
4 162044 108738 126351 
5 162044 108738 126351 
6 162044 108738 126351 
7 162044 108738 126351 
8 162044 126351 108738 
9 162044 126351 108738 
10 162044 126351 108738 
11 162044 126351 108738 
12 162044 126351 108738 
13 162044 126351 108738 
14 162044 126351 108738 
15 162044 126351 108738 
16 166807 54161 133418 
17 166807 54161 133418 
18 166807 54161 133418 
19 166807 54161 133418 
20 166807 54161 133418 
21 166807 54161 133418 
22 166807 54161 133418 
23 166807 54161 133418 
24 166807 133418 54161 
25 166807 133418 54161 
26 166807 133418 54161 
27 166807 133418 54161 
28 166807 133418 54161 
29 166807 133418 54161 
30 166807 133418 54161 
31 166807 133418 54161 
32 166807 133418 54161 
33 166807 54161 133418 
34 166807 54161 133418 
35 167948 54161 135796 
36 167948 54161 135796 
37 167948 54161 135796 
38 167948 54161 135796 
39 167948 54161 135796 
40 167948 54161 135796 
41 167948 54161 135796 
42 167948 135796 54161 
43 167948 135796 54161 
44 167948 135796 54161 
45 167948 135796 54161 
46 167948 135796 54161 
47 167948 135796 54161 
48 167948 135796 54161 
49 167948 135796 54161 
50 167948 135796 54161 

На первый взгляд, я не думаю, что будет бороться с этим типом манипулирования данными, однако я, к сожалению, найти это довольно сложно. Любая помощь будет оценена!

Спасибо,

+0

Вам нужны строки, которые нужно дублировать? – AlexR

+0

строки дублируются в dataframe, да. фрейм соответствует баскетбольной игре, и каждая строка соответствует конкретному игроку (так что для любой данной игры и команды есть 8-10 игроков, которые играют) – Canovice

+0

Все верно, что может быть реализовано с помощью соединения. NB, что ваш желаемый результат пропускает информацию о том, в какую команду принадлежал конкретный игрок; мое решение содержит эту информацию. Если вы этого не хотите, просто отпустите столбец 'team_id' и переименуйте столбцы' team1_id' и 'team2_id' по мере необходимости. – AlexR

ответ

3

Вот решение с помощью tidyr и dplyr.

library(dplyr) 
library(tidyr) 
teams <- DF %>% 
    group_by(game_id, team_id) %>% # For every game_id and team_id 
    summarise() %>% # Create one row 
    # Grouping is now for every game_id 
    mutate(team_number = paste0("team", row_number(), "_id")) %>% # generate the to-be column name of this team_id 
    spread(team_number, team_id) # Spread the column names to create the new columns 
# Now join the team data to the original DF: 
res <- DF %>% 
    left_join(teams, by = "game_id") 

res теперь будут иметь те же столбцы, как DF плюс еще два столбца, team1_id и team2_id содержащие team_id первого соответственно. вторая команда в игре, как она появляется в данных. Он также будет иметь столбец team_id, который равен либо team1_id, либо team2_id в зависимости от того, к какой команде принадлежит настоящий игрок.

Забавный факт: Если game_id имеет более двух team_id сек код будет корректно создавать новые столбцы team3_id, team4_id и т.д., как это необходимо.

+0

Я думаю, что это хорошая возможность установить dplyr. Я вижу, что это часто предлагается в качестве решения, это очень хороший пакет? – Canovice

+0

Да, это так. Вы можете быстро привыкнуть к нотации и выполнять задачи по передаче данных очень быстро. Для того же синтаксиса с большей производительностью существует также новый пакет 'dtplyr', слияние' dplyr' и 'data.table'. 'tidyr' - подобный пакет, подходящий для изменения ваших данных и переоценки (в частности,' spread', 'сбор',' fill' и 'replace_na' - очень полезные функции' tidyr') – AlexR

+1

интересно, ладно спасибо – Canovice

Смежные вопросы

 Смежные вопросы