标签按时差复制,生成id

时间:2012-01-12 17:06:22

标签: r data-management

好吧,我刚刚开始使用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])

1 个答案:

答案 0 :(得分:1)

您可以重新排序数据,然后比较后续行。如果有一个新名字 - 它是一个新人。如果差距超过30年,那么它就是一个新人。如果名称相同,则年数差距<1。 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)
相关问题