在R中使用select函数时出错

时间:2014-03-06 17:42:37

标签: r dplyr

我想获得用户最常播放的歌曲。我想在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

提前致谢

2 个答案:

答案 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)。在这里,我们选择每个组中条件TRUEdf %.% 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 

现在我建议你从Hadley here和Gavin Simpson here投票选出两种出色的方法。