2016-04-05 2 views
0

У меня есть кадр данных отдельных лиц и их супругов с некоторой личной информацией (то есть фамилиями), которые я рандомизировал с помощью plyr :: mapvalues ​​для защиты идентификаторов. Вот воспроизводимый пример того, как он выглядел до и после изменения фамилии:Повторно заполнить столбец в реляционном кадре данных после рандомизации в 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 

Каждый человек имеет свой собственный id номер, но не все люди имеют супругов. Если у человека есть супруг (а), его супруг (а) id отражен в столбце spouse_id. Я сделал это так, чтобы позже я мог фильтровать отдельных лиц и их супругов, используя что-то вроде dplyr::filter(d, spouse %in% spouse_id).

Мой вопрос, как я могу использовать реляционные id и spouse_id столбцы повторно заполнить spouse колонку так, чтобы она отражала новые рандомизированные фамилии? то есть окончательный ожидаемый результат будет:

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 

... Так что некоторые конкатенации будут задействованы на first_name и surname колонн. Я никогда не делал что-то довольно условное в R - в Excel. Думаю, это были бы вложенные функции VLOOKUP ...

Спасибо, извините, это так специфично, но, надеюсь, это представляет интересный вызов кому-то там.

+0

Вы можете показать ожидаемый результат? – akrun

+0

@akrun извините, отредактирован правильно сейчас! – Von

+0

Также есть ваши строки NA или фактические НС? В вашем примере строки – Sotos

ответ

1

Предполагая, что ваш NAs фактического NAs, то

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 
Смежные вопросы