我想这首歌是用户的播放最频繁。 这三个领域我想在csv文件的用户id,songId和playCount但选择功能给了一个错误:
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
提前致谢
在您链的序列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
从所产生的数据帧中的songID变量summarise
中,songID变量是找不到的。
df %.%
group_by(userId) %.%
summarise(
one = max(playCount)) %.%
select(userId, songId, playCount)
# Error in eval(expr, envir, enclos) : object 'songId' not found
更合适的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
你会发现几个不错这里dplyr例子 。
我不下来票,一般,但这个问题是根本,揭示了没有调查,在一定程度上复制,该解决方案是很容易找到其他地方。
有几种方法来实现这一目标。
而D本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。 具有百万行数据帧尝试它
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]
组:用户id
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
并使用哈德利的方法
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
现在,我建议你到赞成票两颗闪亮的办法,从哈德利在这里 ,并从加文·辛普森在这里 。