2014-03-05 36 views
2

我正在使用R来尝试获取每个用户最喜欢的5首歌曲,他们所播放的歌曲最多。我目前有代码来计算最高的播放歌曲,但我想知道如何获得该用户的下4个最高播放歌曲,假设每个用户播放了至少5首歌曲。我是否必须从数据集中删除最高值并再次运行它,还是有更简单的方法?计数变量的5个最高值

write.csv(group_by(mydata,userId) %.% 
summarise(favourite=max(playCount)), file="test.csv") 

数据的一个例子是这样的

userId  songId   playCount 
A   568r    85 
A   711g    18 
C   34n    18 
E   454j    65 
D   663a    72 
B   35d    84 
A   34c    72 
A   982s    65 
E   433f    11 
A   565t    7 
+0

相关:[*找到第二(三...)最高/最低值的最快方法在向量或列*](http://stackoverflow.com/questions/2453326/fastest-way-to-find-second-third-highest-lowest-value-in-vector-or-column/) –

回答

3

您可以使用:

rev(sort(x))[1:n] 

得到一个向量的顶部n值。如果你想上n唯一值,只需添加一个电话unique()

rev(sort(unique(x)))[1:n] 
+0

我会尝试一下。谢谢! – Cormac

+2

它可能会加速一些事情来使用'sort.int'的'partial'参数(即'sort'调用)。而不是使用'rev',你可以设置'decrease = TRUE',或者只使用'tail'。 –

2

另一种方式......

library(dplyr) 

mydata2 <- group_by(mydata, userId) %.% 
       arrange(userId, -playCount) %.% 
       mutate(rank = rank(-playCount)) %.% 

       # remove `rank > 1` if you want to keep the first song 
       filter(rank > 1, rank < 6) %.% 

       select(userId, songId, playCount) 
相关问题