2016-04-05 7 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番号を持っていますが、すべての人が配偶者を持っていません。ある人に配偶者がいる場合、その配偶者の個人idspouse_idに反映されます。私はこれをして、後で個人とその配偶者を別々にフィルタリングして、dplyr::filter(d, spouse %in% spouse_id)のようなものを使用することができました。

私の質問は、spouse列を再配置して新しい無作為化された姓が反映されるように、関係するidとの列をどうやって使うことができますか?すなわち、最終的な予想される出力は次のようになります。

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_namesurname列に関与することになります。私は非常に条件付きのRをExcelで実行したことはありません.Excelでは入れ子にされたVLOOKUP関数になると思います...

ありがとう、申し訳ありませんが、それは非常に具体的ですが、うまくいけば、

+0

は、あなたが期待される出力を表示することができ、その後、あなたのNASが、実際のNAと仮定すると? – akrun

+0

@akrun申し訳ありません、正しく編集されました! – Von

+0

NAストリングまたは実際のNAもありますか?あなたの例では文字列があります – Sotos

答えて

1

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 
関連する問題