从另一个数据框向长数据框添加新列?

时间:2014-11-20 16:24:13

标签: r 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循环成功地使用了它。我正在使用的实际数据有数千行,这需要很长时间。我想要一个矢量化的方法,但我很难想出办法。

1 个答案:

答案 0 :(得分:1)

尝试mergematch

  1. 这里的merge(可能会破坏你的行排序,有时可能很慢):

    merge(AGE_DF, GOALS_DF, all = TRUE)
    
  2. 此处使用match AGE_DF$age[match(GOALS_DF$names, AGE_DF$names)] ,它使用基本索引和子集。当然,将结果分配给新列。

    melt

  3. 这是另一个需要考虑的选项:首先将数据集转换为长格式,然后进行合并。在这里,我已经使用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 和&#34; data.table&#34;

    完成了它
    dcast

    我已经添加了rownames,因此您可以使用{{1}}返回宽格式并保留行排序(如果它很重要)。