【问题标题】:tag duplicates by time difference, generate id按时差标记重复,生成id
【发布时间】:2012-01-12 17:06:21
【问题描述】:

好的,我刚从 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])

【问题讨论】:

    标签: r data-management


    【解决方案1】:

    您可以重新排序数据,然后比较后续行。如果有一个新名字——那就是一个新人。如果差距大于30年,那就是新人。如果姓名相同,且年差

    简而言之,如果名称更改或名称相同但间隔大于 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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2018-12-09
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多