2012-01-12 2 views
1

괜찮 았어, 지금 막 R으로 시작하고 다소 순간 붙어 있습니다. 선거 결과가있는 데이터 집합이 있고 사람의 유일한 식별자는 이름이있는 문자열 변수입니다. 많은 정치인들이 한 번 이상의 선거에 참여할 때 한 번 이상 등장합니다.태그가 시간 차이로 복제 됨, ID 생성

각 정치인을 식별 할 ID를 생성하고 싶습니다. 그러나 일부 이름은 더 일반적이며 실제로 다른 사람을 식별합니다. 이러한 경우를 시차를 고려하여 선택하고 싶습니다. 즉, 외모 사이에 30 년 이상이 있으면 같은 이름이 다른 사람에게 속합니다.

각 사건의 차이를 계산했으며, 발생 사이에 30 년 이상 차이가있을 때마다 모든 후속 사건이 다른 사람의 것이라고 기록합니다. 나는 루프로 도넛을 써 왔지만, 내가 원하는 방식대로 작동시키지 못했고, 이것을 해결할 더 관용적 인 방법이 있다고 생각한다.

다음 이름 변수 및 레코드를 사용하여 각 사람에 대해 고유 한 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 년 이상의 격차가 있다면 그것은 새로운 사람입니다. 이름이 같고 년 간격이 < 인 경우 동일한 사람. 데이터의 순서가 바뀌면서 날짜 간격이 0보다 작 으면 이름이 변경되어 분명히 새로운 사람이됩니다.

이름의 변경 또는 동일한 이름이지만 30 년 이상의 간격이있는 경우 이전 행의 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) 
+0

잘 작동합니다. – ilprincipe