假设我有两个数据框。我有一个列出足球运动员的姓名,他们参加过的球队以及他们在每个球队进球的进球数的人。然后,我还有一个数据框,其中包含足球运动员的年龄和他们的姓名。如何在目标数据框的“年龄”列中向目标数据框添加“ 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循环使它正常工作。我正在使用的实际数据具有数千行,这需要很长时间。我想要向量化的方法,但是在想办法做到这一点时遇到了麻烦。
尝试merge
或match
。
这是merge
(很可能会弄乱您的行顺序,有时可能会很慢):
merge(AGE_DF, GOALS_DF, all = TRUE)
这是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
它返回宽格式并保留行顺序(如果重要的话)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句