2016-04-05 11 views
0

Ich habe einen Datenrahmen von Personen und ihren Ehepartnern mit einigen persönlichen Informationen (d. H. Nachnamen), die ich mit plyr :: mapvalues ​​zum Schutz von Identitäten randomisiert habe. Hier ist ein reproduzierbares Beispiel dafür, wie es aussah vor und nach dem Namen zu ändern:Erneutes Auffüllen der Spalte in einem relationalen Datenrahmen nach der Randomisierung in R

# before 
d <- data.frame(id = c(1:6), 
       first_name = c('Jeff', 'Marilyn', 'Gwyn', 
           'Alice', 'Sam', 'Sarah'), 
       surname = c('Goldbloom', 'Monroe', 'Paltrow', 'Goldbloom', 
          'Smith', 'Silverman'), 
       spouse_id = c(2, 1, 1, 5, 4, "NA"), 
       spouse = c('Marilyn Monroe', 'Jeff Goldbloom', 'Jeff Goldbloom', 
          'Sam Smith', 'Alice Goldbloom', 'NA')) 
d 
> id first_name surname spouse_id   spouse 
    1  Jeff Goldbloom   2 Marilyn Monroe 
    2 Marilyn Monroe   1 Jeff Goldbloom 
    3  Gwyn Paltrow   1 Jeff Goldbloom 
    4  Alice Goldbloom   5  Sam Smith 
    5  Sam  Smith   4 Alice Goldbloom 
    6  Sarah Silverman  NA    NA 

# replacement names to serve as surnames (doesn't matter what they are, just 
that the ratios remain the same as before; mapvalues takes care of this) 

repnames <- c("Arman" , "Clovis" , "Garner" , "Casey" , "Birch") 
s <- unique(d$surname) 
d$surname <- plyr::mapvalues(d$surname, from = s, to = repnames) #replace surnames 

# After replacement, the dataframe looks like: 
d 
> id first_name surname spouse_id   spouse 
    1  Jeff Arman   2 Marilyn Monroe 
    2 Marilyn Clovis   1 Jeff Goldbloom 
    3  Gwyn Garner   1 Jeff Goldbloom 
    4  Alice Arman   5  Sam Smith 
    5  Sam Casey   4 Alice Goldbloom 
    6  Sarah Birch  NA    NA 

Jeder Mensch hat seine eigene id Nummer, aber nicht alle Menschen haben Ehegatten. Wenn eine Person einen Ehepartner hat, wird die Person ihres Ehepartners id in der Spalte spouse_id wiedergegeben. Ich tat dies, damit ich Einzelpersonen und ihre Ehegatten später mit etwas wie dplyr::filter(d, spouse %in% spouse_id) getrennt filtern konnte.

Meine Frage ist, wie kann ich die relationalen id und spouse_id Spalten verwenden, um die Spalte wieder zu füllen, so dass es die neuen, randomisierten Nachnamen widerspiegelt? das heißt, die endgültige würde erwartete Ausgabe sein:

id first_name surname spouse_id   spouse 
    1  Jeff Arman   2  Marilyn Clovis 
    2 Marilyn Clovis   1  Jeff Arman 
    3  Gwyn Garner   1  Jeff Arman 
    4  Alice Arman   5  Sam Casey 
    5  Sam Casey   4  Alice Arman 
    6  Sarah Birch  NA    NA 

... So werden einige Verkettung an den first_name und surname Spalten beteiligt sein. Ich habe noch nie etwas so bedingtes in R gemacht - in Excel denke ich, es wäre verschachtelte SVERWEIS-Funktionen ...

Danke, tut mir leid, es ist so spezifisch, aber hoffentlich stellt es eine lustige Herausforderung für jemanden da draußen.

+0

Können Sie die erwartete Ausgabe zeigen? – akrun

+0

@akrun Sorry, jetzt korrekt bearbeitet! – Von

+0

Sind auch Ihre NA Strings oder tatsächlichen NAs? In Ihrem Beispiel sind Strings – Sotos

Antwort

1

Unter der Annahme, dass Ihr NAs tatsächlichen NAs sind, dann

d$spouse <- paste(d$first_name, d$surname)[d$spouse_id] 
d$spouse 
#[1] "Marilyn Clovis" "Jeff Arman"  "Jeff Arman"  "Sam Casey"  "Alice Arman" NA