簡體   English   中英

將新列添加到來自另一個數據框的長數據框?

[英]Add new column to long dataframe from another dataframe?

假設我有兩個數據框。 我有一個列出足球運動員的姓名,他們參加過的球隊以及他們在每個球隊進球的進球數的人。 然后,我還有一個數據框,其中包含足球運動員的年齡及其姓名。 如何在目標數據框的“年齡”列中向目標數據框添加“ names_age”列,而不在“ teammates_names”列中添加球員的年齡列? 如何添加隊友的“年齡”列? 簡而言之,我想要兩個年齡列:一個用於第一組球員,一個用於第二組球員。

> AGE_DF

  names age
1   Sam  20
2   Jon  21
3  Adam  22
4  Jason 23
5  Jones 24
6  Jermaine 25

> GOALS_DF
   names goals      team teammates_names teammates_goals teammates_team
1    Sam     1       USA           Jason               1        HOLLAND
2    Sam     2   ENGLAND           Jason               2       PORTUGAL
3    Sam     3    BRAZIL           Jason               3          GHANA
4    Sam     4   GERMANY           Jason               4       COLOMBIA
5    Sam     5 ARGENTINA           Jason               5         CANADA
6    Jon     1       USA           Jones               1        HOLLAND
7    Jon     2   ENGLAND           Jones               2       PORTUGAL
8    Jon     3    BRAZIL           Jones               3          GHANA
9    Jon     4   GERMANY           Jones               4       COLOMBIA
10   Jon     5 ARGENTINA           Jones               5         CANADA
11  Adam     1       USA        Jermaine               1        HOLLAND
12  Adam     1   ENGLAND        Jermaine               1       PORTUGAL
13  Adam     4    BRAZIL        Jermaine               4          GHANA
14  Adam     3   GERMANY        Jermaine               3       COLOMBIA
15  Adam     2 ARGENTINA        Jermaine               2         CANADA

我嘗試過的事情:我已經成功使用for循環使它工作了。 我正在使用的實際數據有數千行,這需要很長時間。 我想要向量化的方法,但是在想辦法做到這一點時遇到了麻煩。

嘗試mergematch

  1. 這是merge (可能會加重您的行順序,有時可能會很慢):

     merge(AGE_DF, GOALS_DF, all = TRUE) 
  2. 這是match ,它利用基本的索引和子集。 當然,將結果分配給新列。

     AGE_DF$age[match(GOALS_DF$names, AGE_DF$names)] 

這是要考慮的另一個選項:首先將數據集轉換為長格式,然后進行合並。 在這里,我已經完成了melt和“ data.table”:

library(reshape2)
library(data.table)
setkey(melt(as.data.table(GOALS_DF, keep.rownames = TRUE), 
            measure.vars = c("names", "teammates_names"), 
            value.name = "names"), names)[as.data.table(AGE_DF)]
#     rn goals      team teammates_goals teammates_team        variable    names age
#  1:  1     1       USA               1        HOLLAND           names      Sam  20
#  2:  2     2   ENGLAND               2       PORTUGAL           names      Sam  20
#  3:  3     3    BRAZIL               3          GHANA           names      Sam  20
#  4:  4     4   GERMANY               4       COLOMBIA           names      Sam  20
#  5:  5     5 ARGENTINA               5         CANADA           names      Sam  20
#  6:  6     1       USA               1        HOLLAND           names      Jon  21
## <<SNIP>>
# 28: 13     4    BRAZIL               4          GHANA teammates_names Jermaine  25
# 29: 14     3   GERMANY               3       COLOMBIA teammates_names Jermaine  25
# 30: 15     2 ARGENTINA               2         CANADA teammates_names Jermaine  25
#     rn goals      team teammates_goals teammates_team        variable    names age

我已經添加了行名,以便您可以使用dcast返回寬格式並保留行順序(如果重要的話)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM