2012-01-12 7 views
1

私はちょうどRで始まっていて、今はやや固まっています。私は選挙結果を持つデータセットを持っており、人の唯一の識別子は彼/彼女の名前を持つ文字列変数です。多くの政治家は複数の選挙に参加しているため、複数回出席する。タグ時間差で重複して、IDを生成

各政治家を識別するIDを生成したいと思います。しかし、いくつかの名前はより一般的であり、実際には異なる人物を識別します。発生の時間差を見ることでこれらのケースを区別したいと思います。つまり、出現間に30年以上がある場合、同じ名前が別の人に属します。

私は各出現間の違いを計算しました。出現間に30年以上の違いがあるたびに、その後の出現はすべて別の人物に属するという記録を作りたいと思います。私はループで手を洗いましたが、私が望むように動作させることはできませんでした。これを解決するためのより慣れた方法があると思います。

次に、name変数とレコードを使用して各自の一意のIDを作成したいと思いますが、これはid()関数を使って簡単に行うことができます。

df <- df[order(df$name, df$year),] 

# difference between each occurence, NA for first occurence 
df$timediff <- ave(df$year, df$name, FUN=function(x) c(NA,diff(x))) 

# absolute difference to first occurence, haven't used this so far 
df$timediff.abs <- ave(df$year, df$name, FUN=function(x) x - x[1]) 

答えて

1

データの順序を変更し、後続の行を比較することができます。新しい名前があれば、それは新しい人物です。 30年以上のギャップがあれば、それは新しい人です。名前が同じで、年の間隔が< 30の場合、同じ人。データの順序が変更されると、日付の差が0より小さい場合は名前が変更されているので、明らかに新しい人物です。

具体的には、名前に変更があっても同じ名前でも30年を超えるギャップがある場合は、前の行と同じアイデンティティを仮定しません。逆に、同じアイデンティティを仮定しない場合は、ユニークな識別子を増やしてください。

上記のルールを使用して一意の識別子を割り当てる例を示します。

set.seed(0) 
d = sample((1900:2000), 100, replace = TRUE) 
v = sample(letters, 100, replace = TRUE) 
t1 = data.frame(v,d) 
t2 = t1[order(t1$v,t1$d),] 
t2$sameName = c(FALSE, t2$v[2:100] == t2$v[1:99]) 
t2$diffYrs = c(0,diff(t2$d)) 
t2$close = (t2$diffYrs >= 0) & (t2$diffYrs < 30) 
t2$keepPerson = (t2$sameName & t2$close) 
t2$identifier = cumsum(!t2$keepPerson) 
+0

ありがとうございました。 – ilprincipe