2013-02-25 19 views
9

Im folgenden Beispiel ist userids mein Referenzdatenrahmen und userdata ist der Datenrahmen, in dem die Ersetzungen stattfinden sollen.Ersetze Werte im Datenrahmen basierend auf anderen Datenrahmen in R

> userids <- data.frame(USER=c('Ann','Jim','Lee','Bob'),ID=c(1,2,3,4)) 
> userids 
    USER ID 
1 Ann 1 
2 Jim 2 
3 Lee 3 
4 Bob 4 

> userdata <- data.frame(INFO=c('foo','bar','foo','bar'), ID=c('Bob','Jim','Ann','Lee'),AGE=c('43','33','53','26'), FRIENDID=c('Ann',NA,'Lee','Jim')) 
> userdata 
    INFO ID AGE FRIENDID 
1 foo Bob 43  Ann 
2 bar Jim 33  NA 
3 foo Ann 53  Lee 
4 bar Lee 26  Jim 

Wie ersetze ich ID und friendID in userdata mit der ID USER in userids entspricht?

Die gewünschte Ausgabe:

INFO ID AGE FRIENDID 
1 foo 4 43  1 
2 bar 2 33  NA 
3 foo 1 53  3 
4 bar 3 26  2 
+0

Was meinst du mit "richtig"? Möchten Sie 'userids $ USER' mit' userdata $ ID' abgleichen? –

+1

Ich denke, "richtig" sollte "Entsprechung" sein. – Arun

+0

@Robert, es würde helfen, die gewünschte Ausgabe zu haben (um diese Verwirrungen zu vermeiden, für das nächste Mal). – Arun

Antwort

16

Verwendung match:

userdata$ID <- userids$ID[match(userdata$ID, userids$USER)] 
userdata$FRIENDID <- userids$ID[match(userdata$FRIENDID, userids$USER)] 
0

hier ein Versuch sqldf mit dem Ergebnis zu erhalten als ein Vielfach auf differents Spalten verbinden.

library(sqldf) 
    sqldf('SELECT d.INFO,d.AGE,i1.ID ,i2.ID FRIENDID 
     FROM 
     userdata d 
     INNER JOIN 
     userids i1 ON (i1.USER=d.FRIENDID) 
     INNER JOIN 
     userids i2 ON (i2.USER=d.ID)') 

INFO AGE ID FRIENDID 
1 foo 43 1  4 
2 foo 53 3  1 
3 bar 26 2  3 

Aber das entfernt NA Linien! vielleicht kann mir jemand etwas vorschlagen, wie man mit NA umgeht!

EDIT

Dank G. Grothen Kommentar, erhalten die INNER durch LEFT ersetzen wir das Ergebnis.

sqldf('SELECT d.INFO,d.AGE,i1.ID ,i2.ID FRIENDID 
     FROM 
     userdata d 
     LEFT JOIN 
     userids i1 ON (i1.USER=d.FRIENDID) 
     LEFT JOIN 
     userids i2 ON (i2.USER=d.ID)') 
INFO AGE ID FRIENDID 
1 foo 43 1  4 
2 bar 33 NA  2 
3 foo 53 3  1 
4 bar 26 2  3 
+0

In Bezug auf Ihre Frage ersetzen Sie die beiden Fälle von "INNER" mit "LINKS". –

1

Dies ist eine Möglichkeit:

library(qdap) 
userdata$FRIENDID <- lookup(userdata$FRIENDID, userids) 
userdata$ID <- lookup(userdata$ID, userids) 

oder eine Zeile Preis zu gewinnen:

userdata[, c(2, 4)] <- lapply(userdata[, c(2, 4)], lookup, key.match=userids) 
+0

'qdap' sieht ziemlich gut aus, aber ich sehe es nicht in meinen Repositories. – N8TRO

+1

Nicht sicher warum. Vielleicht liegt es daran, dass es sich um eine neuere Version handelt. Probieren Sie 'install.packages (" qdap ")' aus oder Sie könnten '' library (devtools) '' 'install_github (" qdap "," trinker ")' für die devel. Ausführung. –

+0

Fehlgeschlagen. 'FEHLER: Abhängigkeit 'openNLP' ist nicht verfügbar für Paket 'qdap'' – N8TRO

0

Hier ist eine mögliche Lösung, die auch auf Datensätze mit mehreren Datensätzen von jeweils arbeiten ID, obwohl wir zuerst die ID- und FRIENDID-Variablen zu Zeichen erzwingen müssen:

> userdata$ID <- sapply(userdata$ID, function(x){gsub(x, userids[userids$USER==x, 2], x)}) 
> userdata$FRIENDID <- sapply(userdata$FRIENDID, function(x){gsub(x, userids[userids$USER==x, 2], x)}) 
Verwandte Themen