我想获得用户最常播放的歌曲。我想在csv文件中使用的三个字段是userId,songId和playCount,但select函数给出了错误:
write.csv(group_by(mydata,userId) %.%
summarise(one=max(playCount)) %.%
select(userId,songId,playCount), file="FavouriteSongs.csv")
Error in eval(expr, envir, enclos) : object 'songId' not found
数据的示例如下所示
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 :(得分:2)
在dplyr
操作的链式序列中,summarise
调用将产生两列:分组变量和汇总函数的结果。
df %.%
group_by(userId) %.%
summarise(
one = max(playCount))
# Source: local data frame [5 x 2]
#
# userId one
# 1 A 85
# 2 B 84
# 3 C 18
# 4 D 72
# 5 E 65
当您尝试select
summarise
生成的数据框中的df %.%
group_by(userId) %.%
summarise(
one = max(playCount)) %.%
select(userId, songId, playCount)
# Error in eval(expr, envir, enclos) : object 'songId' not found
时,找不到songID变量。
dplyr
在这种情况下,更合适的filter
函数是playCount == max(playCount)
。在这里,我们选择每个组中条件TRUE
为df %.%
group_by(userId) %.%
filter(
playCount == max(playCount))
# Source: local data frame [5 x 3]
# Groups: userId
#
# userId songId playCount
# 1 A 568r 85
# 2 C 34n 18
# 3 E 454j 65
# 4 D 663a 72
# 5 B 35d 84
的行。
{{1}}
你找到了几个不错的dplyr examples here。
答案 1 :(得分:-1)
我一般不会投票,但这个问题是基本的,没有调查,有些复制,并且很容易在其他地方找到解决方案。
有几种方法可以实现这一目标。
成为你的data.frame。检索播放次数最多的歌曲的行:
d[d$playCount == max(d$playCount), ]
对于大多数用户播放,请尝试此
d <- data.frame(userId = rep(seq(1:5),2) ,
songId = letters[1:10],
playCount = c(10:19))
> d
userId songId playCount
1 1 a 10
2 2 b 11
3 3 c 12
4 4 d 13
5 5 e 14
6 1 f 15
7 2 g 16
8 3 h 17
9 4 i 18
10 5 j 19
d2<- d[order(-d$playCount), ]
dout <- d2[!duplicated(d2$userId), ]
> dout
userId songId playCount
10 5 j 19
9 4 i 18
8 3 h 17
7 2 g 16
6 1 f 15
我真的不明白这次投票。这种方法是正确的,速度快,几乎与dplyr一样快。尝试使用1000000行数据框
df <- data.frame(userId = rep(seq(1:5),100000) ,
songId = rep(letters[1:10], 100000),
playCount = runif(1000000,10,20))
使用@Henrik dplyr方法
system.time(df %.%
group_by(userId) %.%
filter(
playCount == max(playCount)))
Source: local data frame [5 x 3]
群组:userId
userId songId playCount
1 2 b 19.99995
2 5 j 19.99982
3 1 f 19.99981
4 4 d 19.99995
5 3 h 19.99999
user system elapsed
0.08 0.02 0.09
并使用Hadley方法
df2<- df[order(-df$playCount), ]
dout <- df2[!duplicated(df2$userId), ]
> dout
userId songId playCount
671528 3 h 19.99999
466824 4 d 19.99995
185512 2 b 19.99995
249190 5 j 19.99982
455746 1 f 19.99981
system.time(dout <- df2[!duplicated(df2$userId), ])
user system elapsed
0.13 0.00 0.12