2016-08-11 39 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