1

わかりました。私はRから始めたばかりで、現時点ではやや行き詰まっています。選挙結果を含むデータセットがあります。個人の識別子は、名前が付いた文字列変数のみです。多くの政治家は、複数の選挙に参加するため、複数回登場します。

各政治家を識別するための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])
4

1 に答える 1

1

データを並べ替えて、後続の行を比較できます。新しい名前がある場合、それは新しい人です。30年以上のギャップがある場合、それは新しい人です。名前が同じで、年の差が 30 歳未満の場合は、同一人物です。データが並べ替えられているため、日付のギャップが 0 未満の場合は、名前が変更されているため、明らかに新しい人です。

簡潔に言うと、名前が変わっているか、名前が同じでも 30 年以上の間隔がある場合、前の行と同じ ID を想定していません。(逆に、同じ ID を想定していない場合は、一意の ID をインクリメントします。)

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

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)
于 2012-01-12T18:12:54.550 に答える