【问题标题】:Error using select function in R [duplicate]在 R 中使用选择函数时出错 [重复]
【发布时间】:2014-03-06 17:42:36
【问题描述】:

我想获取用户播放频率最高的歌曲。我在 csv 文件中想要的三个字段是 userId、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

提前致谢

【问题讨论】:

  • 这与your previous question有何不同?
  • 上一个答案没有给我每个用户的 5 个最高值
  • @Thomas 我的问题是将rev(sort(mydata$playCount))[1:5] 添加到我的函数summarise(one=max(playCount)) 中。

标签: r dplyr


【解决方案1】:

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

当您尝试从summarise 生成的数据帧中尝试select songID 变量时,找不到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 examples here

【讨论】:

    【解决方案2】:

    一般来说,我不会投反对票,但这个问题是基本的,没有显示任何调查,有些重复,并且在其他地方很容易找到解决方案。

    有几种方法可以实现这一点。

    成为你的 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]
    

    组:用户 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 
    

    并使用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 的两种出色方法进行投票。

    【讨论】:

    • 我猜 OP 想要每个用户 ID max
    • @Henrik 是的。现在你说。我将编辑我的答案。
    • 是的,我希望每个用户都达到最大值
    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2019-12-06
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多