【问题标题】:Is there a more elegant way to find duplicated records?有没有更优雅的方法来查找重复记录?
【发布时间】:2012-11-15 16:59:05
【问题描述】:

我的测试框架中有 81,000 条记录,duplicated 显示 2039 是相同的匹配项。对Find duplicated rows (based on 2 columns) in Data Frame in R 的一个回答提出了一种创建仅包含重复记录的较小框架的方法。这也适用于我:

dup <- data.frame(as.numeric(duplicated(df$var))) #creates df with binary var for duplicated rows
colnames(dup) <- c("dup") #renames column for simplicity
df2 <- cbind(df, dup) #bind to original df
df3 <- subset(df2, dup == 1) #subsets df using binary var for duplicated`

但正如海报所指出的那样,它似乎不优雅。有没有更简洁的方法来获得相同的结果:只查看那些重复的记录?

在我的情况下,我正在处理抓取的数据,我需要弄清楚原始数据中是否存在重复项,或者是由我抓取的数据引入的。

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    duplicated(df) 将为您提供一个逻辑向量(所有值均由 T/F 组成),然后您可以将其用作数据框 rows 的索引。

    # indx will contain TRUE values wherever in df$var there is a duplicate
    indx <- duplicated(df$var)
    df[indx, ]  #note the comma 
    

    你可以把它们放在一行中

    df[duplicated(df$var), ]  # again, the comma, to indicate we are selected rows
    

    【讨论】:

    • 谢谢。今晚晚些时候将进行测试。是时候从我一头扎进 R 中的挣扎中休息一下了。
    • 我最后得到了这个:dupes &lt;- df[duplicated(df),c('last','first','external_id')],然后是dupes.unique &lt;- unique(dupes)——因为事实证明有些重复出现了 10 或 12 次。这样我就可以回到我的来源并确认我没有引入重复。
    【解决方案2】:
    doops <- which(duplicated(df$var)==TRUE)
    uniques <- df[-doops,]
    duplicates <- df[doops,]
    

    这是我在尝试从数据框中删除重复条目时通常使用的逻辑。

    【讨论】:

    • 您可以避免使用which 调用并使用! 而不是-
    • 在这种情况下将 = 更改为
    • 您也应该将= 更改为==
    • 你也可以去掉多余的== TRUE
    • @antishatter Google 的 R 风格指南确实更喜欢 &lt;- 而不是 =,作为刚刚了解我的方向的人,我不妨学会“正确”地做到这一点 google-styleguide.googlecode.com/svn/trunk/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多