假设我有两个数据帧。我有一个列出了足球运动员的名字,他们所参加的球队以及他们在每支球队得分的目标数量。然后我还有一个包含足球运动员年龄和名字的数据框。如何添加" 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 :(得分:1)
尝试merge
或match
。
这里的merge
(可能会破坏你的行排序,有时可能很慢):
merge(AGE_DF, GOALS_DF, all = TRUE)
此处使用match
AGE_DF$age[match(GOALS_DF$names, AGE_DF$names)]
,它使用基本索引和子集。当然,将结果分配给新列。
melt
这是另一个需要考虑的选项:首先将数据集转换为长格式,然后进行合并。在这里,我已经使用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}}返回宽格式并保留行排序(如果它很重要)。