2011-03-06 88 views
5

我试图使用ddply方法来获取有关3000个电影的各种信息的数据帧,然后计算每个流派的平均总数。我是R新手,我已经阅读了关于ddply的所有问题,但我似乎仍然无法做到。这是我现在有:R:使用ddply将函数应用于数据子集

> attach(movies) 
> ddply(movies, Genre, mean(Gross)) 
Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress, : 
.fun is not a function. 

我怎么写一个函数,它的值的平均值,在“毛重”栏为每套电影,按流派分组?我知道这似乎是一个简单的问题,但文档对我来说真的很混乱,而且我对R语法还不太熟悉。

除了ddply之外,还有其他方法可以使这更简单吗?

谢谢!

+0

您是否对数据进行了一些预处理?电影数据集既不包含列名“Gross”也不包含“Genre”。有一组二进制标志表示不同的流派,以及一个预算栏... http://had.co.nz/data/movies/ – Chase 2011-03-06 13:54:51

+1

另外,不要使用附加。 – hadley 2011-03-06 14:12:18

回答

10

下面是使用现有的提示数据集的例子GGPLOT2

library(ggplot2); 
mean_tip_by_day = ddply(tips, .(day), summarize, mean_tip = mean(tip/total_bill)) 

希望这是有用的

+0

非常感谢,这是诀窍! – LBR 2011-03-06 06:26:26

2

你也许并不需要plyr一个简单的操作类似。 tapply()很容易完成这项工作,而且您不需要加载额外的软件包。语法也似乎比Ramnath更简单:

tapply(tips$tip, tips$day, mean) 

请注意,plyr是许多任务的绝佳工具。对我来说,这似乎在这里矫枉过正。

+4

请注意,上面的解决方案返回一个列表,而上面的plyr解决方案返回一个data.frame。你可以很容易地将你的解决方案包装在'as.data.frame()'中。 'plyr'看起来有点矫枉过正,直到你开始意识到明确声明你所操作的对象的输入和输出的结构是多么的好。 – Chase 2011-03-07 00:45:35

+0

好点。但原来的问题没有指定所需的格式。也许我应该从ddply推断出来。 – Vincent 2011-03-07 01:07:28