2016-09-22 93 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

哦,我看看如果這是要求,我們可以改變一下代碼,上面更新。 –