【问题标题】:How to apply group by function within pipe function so to not cause errors?如何在管道函数中按函数应用分组以免导致错误?
【发布时间】:2020-04-20 13:50:09
【问题描述】:

我想使用 imdb_csv 数据库进行绘图。我想看看这些年来动画电影的 imdb_ratings 是如何变化的,但是我在按年份对电影进行分组时遇到了问题。我以某种方式设法让 group_by 函数工作,但前提是我已经在函数中启动了新管道。如果我在过滤了一些结果(在第一个块中)的管道函数中按年份进行分组,那么我会收到“找不到动画”的错误。但是第二块的问题是,即使我应用了选择功能,我也只能得到两列,年份和平均每年评级。另外奇怪的是,在控制台上,summarise(mean(as.numeric(imdbRating))) 行总是显示在我正在执行的任何行的下方。

代码:

imdb_ratings <- imdb_ratings %>% filter(Animation == 1 & !str_detect(title, "\\\\$")) %>% 
                                 extract(title, c("title", "year"), 
                                         "^(.*?)(?:\\s*\\([^()]*?(\\d{4})[^()]*\\))?$")  


imdb_ratings <- imdb_ratings %>% select(title, imdbRating, year) %>% 
                                 group_by(year) %>% 
                               mutate(n = n()) %>% 
                               summarise(mean(as.numeric(imdbRating)))

这是我得到的结果:

输入:

structure(list(year = c(1930, 1933, 1934, 1937, 1938, 1939, 1940, 
1942, 1943, 1944, 1946, 1947, 1949, 1950, 1951), `mean(as.numeric(imdbRating))` = c(55, 
53, 58, 74, 67, 65.5, 74, 62.66667, 68.5, 63, 66.25, 65, 72, 
69.5, 71)), row.names = c(NA, -15L), class = c("tbl_df", "tbl", 
"data.frame"))

我不明白为什么即使我选择了标题 imdbRating,它也只显示汇总和年份。还有如何重命名汇总函数?

【问题讨论】:

  • 你可以创建一个名字summarise(Mean = mean(as.numeric(imdbRating)))
  • 它只显示两列,因为第一列是“分组”列,第二列是汇总列(summarise 只返回该列+任何分组列)。如果您需要更多列,请在 group_by 中指定它或为该列创建汇总输出。或者使用mutate,它将给出select 之后的所有列,然后执行distinct
  • 为什么要重命名summary函数?你不喜欢这个名字吗?

标签: r


【解决方案1】:

您选择了title,但您从未对它进行任何操作。如果您想在结果中保留标题,请将其包含在 group_by 函数中。

group_by(title, year) %>% 

事实上,您不需要初始的 select 语句,因为汇总函数只会在结果中包含分组列和汇总列,而忽略所有其他列。

关于n 的总数,一旦您按标题和年份分组,这将为您提供每个标题和每年的动画电影评分数。如果这是您想要的,则将其包含在汇总函数中,您不需要变异。因此,您只需:

imdb_ratings <- imdb_ratings %>% group_by(title, year) %>%
    summarise(n=n(), Mean_rating = mean(as.numeric(imdbRating)))

一个好的图形应该是一个流图:

如果您不想在结果中出现标题(我怀疑这是因为您在提取它时遇到了很多麻烦),然后在 group_by 中省略它。然后,n 的总数将是每年所有动画电影的评分总数,并且您不会在结果中看到标题(类似于您显示的图像)。

关于您执行的任何行下方summarise(mean(as.numeric(imdbRating))) 在控制台上的奇怪外观...我想您只需要使用键盘上的按钮手动删除它即可。 (Ctrl + L 不会清除它)。

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 2012-09-05
    • 2021-12-28
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多