2016-09-22 39 views
2

行我有一个数据集,看起来像这样:删除“半副本”中的R

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.)

我该怎么做?

回答

3

您可以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做到这一点使用aveorder应该是:

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

很好的答案。如果你想要的不仅仅是顶级1,还可以使用'arrange'而不是'which.max';如果你想离散分组推荐的最高百分位数,可以使用'arrange'。 – shayaa

+0

@shayaa正确!我脑海中想到的第一个想法是使用'top_n',但即使这样会返回'xx'中的两行 –

2

这个怎么样?

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> 

如果我们要删除重复retweetCounts,那么我们可以尝试以下方法:

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> 
+0

哦,我看看如果这是要求,我们可以改变一下代码,上面更新。 –