ddplyr按年份汇总,包括年份计数

时间:2018-12-02 19:51:06

标签: r plyr

这应该超级简单,但我似乎无法弄清楚。

我正在使用ggplot2movies库来获取数据框movies,并且我试图将数据汇总到一个易于绘制的数据框中。如果您不想加载ggplot2movies库,则相关数据的示例为:

# A tibble: 6 x 2
   year rating
  <int>  <dbl>
1  1971    6.4
2  1939    6  
3  1941    8.2
4  1996    8.2
5  1975    3.4
6  2000    4.3

基于plyr库,我有以下成功的代码:

years <- ddply(movies,"year",summarize,rating=mean(rating))

给出这样的结果,非常适合绘图或折线图:

> head(years)
  year   rating
1 1893 7.000000
2 1894 4.888889
3 1895 5.500000
4 1896 5.269231
5 1897 4.677778
6 1898 5.040000

但是,我没有一种添加计数列的方法,以便拥有第三个变量,例如size,该变量可以在情节图中可视化每年制作的电影的数量。它应该像这样简单:

years <- ddply(movies,"year",summarize,rating=mean(rating),count=count(years))

但是,这会导致错误:

  

summarise_impl(.data,点)中的错误:     评估错误:没有适用于“字符”类对象的适用于“组”的方法。

我可以在原始数据框中添加一列,只是重复值1,然后对该列求和。但是,鉴于R的通用性和实用性,我认为ddplyr函数中有一些更简单,更适当的方法来实现它。

1 个答案:

答案 0 :(得分:2)

您可以使用n()进行计数。

library(ggplot2movies)
library(dplyr)

data("movies")

movies %>%
  group_by(year) %>%
  summarise(rating = mean(rating),
            years = n()) -> mvs

head(mvs, 10)
## A tibble: 10 x 3
#    year rating years
#   <int>  <dbl> <int>
# 1  1893   7        1
# 2  1894   4.89     9
# 3  1895   5.5      3
# 4  1896   5.27    13
# 5  1897   4.68     9
# 6  1898   5.04     5
# 7  1899   4.28     9
# 8  1900   4.73    16
# 9  1901   4.68    28
#10  1902   4.9      9

OP提出的另一种解决方案是使用软件包plyr

library(plyr)

mvs2 <- ddply(movies, "year", summarize, 
              rating = mean(rating), years = length(year))
all.equal(mvs, mvs2)
#[1] TRUE