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 年,则您不会假设与前一行相同。(相反,如果你不假设相同的身份,那么你增加你的唯一标识符。)

这是一个使用上述规则分配唯一标识符的示例。

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 回答