这应该超级简单,但我似乎无法弄清楚。
我正在使用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函数中有一些更简单,更适当的方法来实现它。
答案 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