2016-08-11 38 views
-1

对不起,我不能为标题想出一个更好的名称,我非常努力地用单词解释手头的问题,所以让我展示代替数据帧的例子。R数据框 - 在一列中使用公共值来查找另一列中的值

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 

这是我正在使用的数据帧。重要的是,对于每个game_id,有两个team_id。如果它有助于解决问题,那么game_ids就会全部排序,并且可以对team_ids进行分组,以便为​​每个game_id显示第一个team_id的所有实例,然后显示第二个team_id的所有实例(目前情况并非如此,因为你可以在第33和34行看到)。我需要创建一个名为team2_id的第三列,其中这个列是其他与game_id对应的team_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

行在数据框中重复出现,是的。该数据框对应于篮球游戏,并且每一行对应于特定玩家(因此对于任何给定的游戏和团队,有8-10个玩家玩过) – Canovice

+0

好吧,可以用加入来实现。注意你所希望的输出会错过所属队员的信息;我的解决方案包含此信息。如果你不想要它,只需放下'team_id'列并根据需要重命名列'team1_id'和'team2_id'。 – AlexR

回答

3

下面是使用tidyrdplyr的溶液。

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_idteam2_id包含第一RESP的team_id。在数据中出现的第二支球队。它也将有team_id这一列,它等于team1_idteam2_id,具体取决于实际玩家属于哪个团队。有趣的事实:如果一个game_id有两个以上的team_id s,代码将优雅地创建新列team3_id,team4_id等等。

+0

我想这是安装dplyr的好机会。我认为它经常被认为是一种解决方案,它是一个非常好的软件包吗? – Canovice

+0

是的。您可以快速熟悉符号并快速完成数据处理任务。对于具有更高性能的相同语法,还有新的'dtplyr'包,它是'dplyr'和'data.table'的融合。 'tidyr'是一个类似的软件包,适合重塑你的数据和重新估价(特别是'spread','gather','fill'和'replace_na'是'tidyr'的非常有用的功能] – AlexR

+1

有趣,好吧谢谢 – Canovice