按列分组并按R中的另一列排序

Ana*_*and 5 r dplyr kaggle

我正在用R检查kaggle中的imdb电影数据集。

这是最小的repro数据集:

> movies <- data.frame(movie = as.factor(c("Movie 1", "Movie 2", "Movie 3", "Movie 4")), director = as.factor(c("Dir 1", "Dir 2", "Dir 1", "Dir 3")), director_rating =  c(1000, 2000, 1000, 3000))

> movies
    movie director director_rating
1 Movie 1    Dir 1            1000
2 Movie 2    Dir 2            2000
3 Movie 3    Dir 1            1000
4 Movie 4    Dir 3            3000
Run Code Online (Sandbox Code Playgroud)

请注意,具有相同导演的每一行具有相同的导演评级值。

我想列出导演,按等级排序,每位导演一行。以下代码有效:

> library(dplyr)
> movies %>% 
  group_by(director) %>%
  summarize(director_rating = mean(director_rating)) %>%
  arrange(desc(director_rating))

    # A tibble: 3 x 2
  director director_rating
    <fctr>           <dbl>
1    Dir 3            3000
2    Dir 2            2000
3    Dir 1            1000
Run Code Online (Sandbox Code Playgroud)

但是,当我知道一位董事的所有评级都相同时,计算均值似乎是浪费的。在R中执行此操作的更惯用/有效的方法是什么?

tal*_*lat 6

实际上,不需要分组和汇总,因为您只是在寻找不同的/唯一的条目。因此,dplyr选项为:

select(movies, -movie) %>% 
  distinct() %>% 
  arrange(desc(director_rating))
#  director director_rating
#1    Dir 3            3000
#2    Dir 2            2000
#3    Dir 1            1000
Run Code Online (Sandbox Code Playgroud)

或者,如果您想保留其他列:

distinct(movies, director, .keep_all = TRUE) %>%   # for dplyr >= 0.5.0
  arrange(desc(director_rating))
#    movie director director_rating
#1 Movie 4    Dir 3            3000
#2 Movie 2    Dir 2            2000
#3 Movie 1    Dir 1            1000
Run Code Online (Sandbox Code Playgroud)

  • 在dplyr 0.5.0中,您的第二种方法不起作用。`distinct`的默认设置是在此处放置`director`以外的cols。要做`distinct(电影,导演,.keep_all = TRUE)%&gt;%range(desc(director_rating))`也许我的版本落后于时代或其他事物... (2认同)
  • @弗兰克对此表示感谢。我还没有升级到0.5 (2认同)