2016-03-27 16 views
1

Angenommen, ich habe zwei Datenrahmen DF1 und DF2 passend alsMehrwert von einem data.frame zu einem anderen data.frame durch eine variable

folgt
Df1 

Id Price Profit Month 
10 5  2  1 
10 5  3  2 
10 5  2  3 
11 7  3  1 
11 7  1  2 
12 0  0  1 
12 5  1  2 

Df2 

Id Name 
9 Kane 
10 Jack 
10 Jack 
11 Will 
12 Matt 
13 Lee 
14 Han 

Jetzt habe ich eine neue Spalte in Df1Name Namen einfügen möchten, und erhalten ihren Wert von Df2 basierend auf passende Id

So modifizierte Df1 wird

Id Price Profit Month Name 
10 5  2  1 Jack 
10 5  3  2 Jack 
10 5  2  3 Jack 
11 7  3  1 Will 
11 7  1  2 Will 
12 0  0  1 Matt 
12 5  1  2 Matt 
+0

'Df2 $ Name [Übereinstimmung (Df1 $ Id, Df2 $ Id)]' zum Beispiel. – nicola

Antwort

3
df1 <- data.frame(Id=c(10L,10L,10L,11L,11L,12L,12L),Price=c(5L,5L,5L,7L,7L,0L,5L),Profit=c(2L,3L,2L,3L,1L,0L,1L),Month=c(1L,2L,3L,1L,2L,1L,2L),stringsAsFactors=F); 
df2 <- data.frame(Id=c(9L,10L,10L,11L,12L,13L,14L),Name=c('Kane','Jack','Jack','Will','Matt','Lee','Han'),stringsAsFactors=F); 
df1$Name <- df2$Name[match(df1$Id,df2$Id)]; 
df1; 
## Id Price Profit Month Name 
## 1 10  5  2  1 Jack 
## 2 10  5  3  2 Jack 
## 3 10  5  2  3 Jack 
## 4 11  7  3  1 Will 
## 5 11  7  1  2 Will 
## 6 12  0  0  1 Matt 
## 7 12  5  1  2 Matt 
3

Verwendung left_join in dplyr

library(dplyr) 
left_join(df1, df2, "Id") 

zB:

> left_join(df1, df2) 
Joining by: "Id" 
    Id Price Profit Month Name 
1 10  5  2  1 Jack 
2 10  5  3  2 Jack 
3 10  5  2  3 Jack 
4 11  7  3  1 Will 
5 11  7  1  2 Will 
6 12  0  0  1 Matt 
7 12  5  1  2 Matt 

Data wrangling cheatsheet von RStudio ist eine sehr hilfreiche Ressource.

2

ist hier eine Option data.table

library(data.table) 
setDT(Df1)[unique(Df2), on = "Id", nomatch=0] 
# Id Price Profit Month Name 
#1: 10  5  2  1 Jack 
#2: 10  5  3  2 Jack 
#3: 10  5  2  3 Jack 
#4: 11  7  3  1 Will 
#5: 11  7  1  2 Will 
#6: 12  0  0  1 Matt 
#7: 12  5  1  2 Matt 

verwenden oder als @Arun in den Kommentaren erwähnt, können wir (:=) die Spalte "Name" nach dem Beitritt on "Id", um die Änderungen zuzuweisen reflektieren im ursprünglichen Datensatz "Df1".

setDT(Df1)[Df2, Name:= Name, on = "Id"] 
Df1 
0

Eine einfache Basis R Option merge()

merge(Df1,unique(Df2), by="Id") 
# Id Price Profit Month Name 
#1 10  5  2  1 Jack 
#2 10  5  3  2 Jack 
#3 10  5  2  3 Jack 
#4 11  7  3  1 Will 
#5 11  7  1  2 Will 
#6 12  0  0  1 Matt 
#7 12  5  1  2 Matt 

Die Funktion unique() hier wegen des doppelten Eintrags verwendet wird, in Df2 über "Jack" sein könnte. Für die im OP beschriebenen Beispieldaten kann die Option by="Id" weggelassen werden, sie könnte jedoch in einem allgemeineren Fall notwendig sein.

Verwandte Themen