2017-08-10 16 views
0

人の名前とID番号のリストを持つデータがあります。一部の人は2〜3回リストされます。各人にはID番号があります。同じ人物である限り、複数回リストされている場合、ID番号は変わりません。このように:重複IDチェック

Name david david john john john john megan bill barbara chris chris 

ID  1  1 2 2 2 2 3 4 5 6 6 

私は、これらのID番号が正しいことと、異なる人が同じID番号を持っていないことを確認する必要があります。その際、新しいID番号を割り当てる新しい変数を作成して、新しいID番号と古いID番号を比較できるようにします。私は、 という名前のコマンドを作成したいと思います。その名前が同じなら、ID番号を同じにします。 どうすればいいですか?これは理にかなっていますか?

+0

一意の名前、IDを追加し、バック – Wen

+0

それをマージした後の長さが異なることになるので、私は、元のデータセットにユニーク(名前)を使用した後にマージすることはできないでしょうか? – Rachel

+0

あなたはマージすることができます。マージは共通の値に基づくルックアップ関数です。 Accessまたはvlookupのdlookup、ExcelまたはCalcのhlookupに似ています。 –

答えて

0

これを実行する方法はたくさんありますが、そのうちのいくつかは上記で示唆されています。私は通常重複/悪いケースを見つけて削除するためにdplyrバージョンを使用します。あなたの目的に応じて、さまざまな出力の例があります。

library(dplyr) 

# example with one bad case 
dt = data.frame(Name = c("david","davud","John","John","megan"), 
       ID = c(1,1,2,3,3), stringsAsFactors = F) 


# spot names with more than 1 unique IDs 
dt %>% 
    group_by(Name) %>% 
    summarise(NumIDs = n_distinct(ID)) %>% 
    filter(NumIDs > 1) 

# # A tibble: 1 x 2 
# Name NumIDs 
# <chr> <int> 
# 1 John  2 


# spot names with more than 1 unique IDs and the actual IDs 
dt %>% 
    group_by(Name) %>% 
    mutate(NumIDs = n_distinct(ID)) %>% 
    filter(NumIDs > 1) %>% 
    ungroup() 

# # A tibble: 2 x 3 
# Name ID NumIDs 
# <chr> <dbl> <int> 
# 1 John  2  2 
# 2 John  3  2 


# spot names with more than 1 unique IDs and the actual IDs - alternative 
dt %>% 
    group_by(Name) %>% 
    mutate(NumIDs = n_distinct(ID)) %>% 
    filter(NumIDs > 1) %>% 
    group_by(Name, NumIDs) %>% 
    summarise(IDs = paste0(ID, collapse=",")) %>% 
    ungroup() 

# # A tibble: 1 x 3 
#  Name NumIDs IDs 
#  <chr> <int> <chr> 
# 1 John  2 2,3