2014-11-20 100 views
1

说我有两个数据帧。我有一个列出了足球运动员的名字,他们曾经效力过的球队,以及他们在每支球队得分的进球数量。然后我还有一个包含足球运动员年龄和名字的数据框。如何将“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循环。我正在使用的实际数据有成千上万行,这需要很长时间。我想要一个矢量化的方法,但我很难想出办法做到这一点。

+0

你试过'merge'吗? – A5C1D2H2I1M1N2O1R2T1 2014-11-20 16:25:41

+0

哦,不,我没有!我现在会尝试。 – goldisfine 2014-11-20 16:26:38

+0

道歉,我不得不在我的问题中添加这个额外的复杂因素(茶友)。 – goldisfine 2014-11-20 16:33:14

回答

1

尝试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 

我已经添加了rownames所以你可以你可以使用dcast要回的宽幅并保留行排序,如果它是重要。

相关问题