![](/img/trans.png)
[英]Add a new column to a dataframe based on multiple columns from another dataframe
[英]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循環使它工作了。 我正在使用的實際數據有數千行,這需要很長時間。 我想要向量化的方法,但是在想辦法做到這一點時遇到了麻煩。
嘗試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
返回寬格式並保留行順序(如果重要的話)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.