【问题标题】:Remove "semi-duplicate" rows in R [duplicate]删除 R 中的“半重复”行 [重复]
【发布时间】:2017-01-31 10:08:04
【问题描述】:

我有一个如下所示的数据集:

  text                 id     screenName retweetCount isRetweet retweeted longitude latitude
1    xx 778980737861062656  0504Traveller            0     FALSE     FALSE      <NA>     <NA>
2    xx 778967536167559168       Iz_Azman            0     FALSE     FALSE      <NA>     <NA>
3    yy 778962265298960384       Iz_Azman            0     FALSE     FALSE      <NA>     <NA>
4    yy 778954988122939392 travelindtoday            2     FALSE     FALSE      <NA>     <NA>
5    zz 778948691969224705           umtn            2     FALSE     FALSE      <NA>     <NA>
6    zz 778942095843135493     flyinsider            0     FALSE     FALSE      <NA>     <NA>

这些是 R 中 twittR 包中的推文。一些推文具有完全相同的 text 但不同的 retweetCount。我想保留唯一的推文(text),但保留那些具有最高 retweetCount 的推文。 (在上述情况下,推文 1、4 和 5。)

我该怎么做?

【问题讨论】:

    标签: r twitter duplicates


    【解决方案1】:

    这个怎么样?

    df
    
        text           id     screenName retweetCount isRetweet retweeted longitude latitude
    1   xx 7.789807e+17  0504Traveller            0     FALSE     FALSE      <NA>     <NA>
    2   xx 7.789675e+17       Iz_Azman            0     FALSE     FALSE      <NA>     <NA>
    3   yy 7.789623e+17       Iz_Azman            0     FALSE     FALSE      <NA>     <NA>
    4   yy 7.789550e+17 travelindtoday            2     FALSE     FALSE      <NA>     <NA>
    5   zz 7.789487e+17           umtn            2     FALSE     FALSE      <NA>     <NA>
    6   zz 7.789421e+17     flyinsider            0     FALSE     FALSE      <NA>     <NA>
    
    merge(df, aggregate(retweetCount~text, df, FUN=max), by=c('text', 'retweetCount'))        
    
        text retweetCount           id     screenName isRetweet retweeted longitude latitude
    1   xx            0 7.789807e+17  0504Traveller     FALSE     FALSE      <NA>     <NA>
    2   xx            0 7.789675e+17       Iz_Azman     FALSE     FALSE      <NA>     <NA>
    3   yy            2 7.789550e+17 travelindtoday     FALSE     FALSE      <NA>     <NA>
    4   zz            2 7.789487e+17           umtn     FALSE     FALSE      <NA>     <NA>
    

    如果我们想删除重复的转推计数,那么我们可以尝试以下方法:

    merge(df[!duplicated(df[c('text', "retweetCount")]),], 
           aggregate(retweetCount~text, df, FUN=max), by=c('text', 'retweetCount'))
    
        text retweetCount           id     screenName isRetweet retweeted longitude latitude
    1   xx            0 7.789807e+17  0504Traveller     FALSE     FALSE      <NA>     <NA>
    2   yy            2 7.789550e+17 travelindtoday     FALSE     FALSE      <NA>     <NA>
    3   zz            2 7.789487e+17           umtn     FALSE     FALSE      <NA>     <NA>
    

    【讨论】:

    • 哦,我看看是不是这个要求,我们可以稍微修改一下代码,在上面更新。
    【解决方案2】:

    您可以通过dplyr 做到这一点

    library(dplyr)
    df %>%
      group_by(text) %>%
      slice(which.max(retweetCount))
    
    #text           id     screenName retweetCount isRetweet retweeted longitude latitude
    #(fctr)        (dbl)         (fctr)        (int)     (lgl)     (lgl)    (fctr)   (fctr)
    #1  xx      7.789807e+17  0504Traveller       0     FALSE     FALSE      <NA>     <NA>
    #4  yy      7.789550e+17 travelindtoday       2     FALSE     FALSE      <NA>     <NA>
    #5  zz      7.789487e+17           umt        2     FALSE     FALSE      <NA>     <NA>
    

    base R 中使用ave和order 的另一种方法是:

    df[ave(df$retweetCount,df$text, FUN = function(x) order(x, decreasing = T)) == 1, ]
    
    # text           id     screenName retweetCount isRetweet retweeted longitude latitude
    #1  xx   7.789807e+17  0504Traveller            0     FALSE     FALSE      <NA>     <NA>
    #4  yy   7.789550e+17 travelindtoday            2     FALSE     FALSE      <NA>     <NA>
    #5  zz   7.789487e+17           umtn            2     FALSE     FALSE      <NA>     <NA>
    

    【讨论】:

    • 好答案。如果您想要的不仅仅是前 1 个,可以使用 arrange 而不是 which.max,如果您想要离散化分组转发的最高百分位数,可以使用 n_tile。
    • @sayaa 正确!我想到的第一个想法是使用top_n,但即使这样也会返回xx中的两行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2021-05-22
    • 2016-05-17
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多