使用公式计算表格中数值的平均值 [R]

6

我知道像xtabs和table这样的命令允许用户进行交叉分析。

例如,以下命令生成一个数据透视表,显示具有相同齿轮数和汽缸数的汽车数量。

> xtabs(~cyl+gear, data = mtcars)
   gear
cyl  3  4  5
  4  1  8  2
  6  2  4  1
  8 12  0  2
> 

我们可以扩展这个公式,使其可以显示每个箱中汽车的马力总和。
> xtabs(hp~cyl+gear, data = mtcars)
   gear
cyl    3    4    5
  4   97  608  204
  6  215  466  175
  8 2330    0  599
> 

我现在想知道,在每个区间内计算汽车马力的平均值是否可行?例如像这样的东西:xtabs(mean(hp)~cyl+gear, data = mtcars)


2
我不确定如何使用以前从未使用过的 xtabs 方法来完成它,但是使用 reshape 包的一种方法是 cast(melt(mtcars, id = c("cyl", "gear")), cyl ~ gear, subset = variable == "hp", mean) - grautur
1
xtabs(hpcyl+gear, data = mtcars)/xtabs(cyl+gear, data = mtcars) 在mtcars数据集中,按照汽缸数和档位对马力进行交叉分析,然后除以按照汽缸数和档位的总数。 - jverzani
4个回答

10
您可以使用reshape库的cast函数在一行中完成此操作。
cast(mtcars, cyl ~ gear, value = 'hp', fun = mean)

7

我收到的来自r-help的一个有趣回复如下:

> attach(mtcars)
> tapply(hp,list(cyl,gear),mean)
         3     4     5
4  97.0000  76.0 102.0
6 107.5000 116.5 175.0
8 194.1667    NA 299.5
> 

1
是的,这才是正确的做法!!!我不使用xtabs,我只使用标准的tapply、apply、lapply函数,因为它们可以完成所有任务。从一开始我就知道必须使用标准的tapply来解决问题,而且确实如此!谢谢。 - Tomas
1
在应用语句中使用函数(x) list(x$cyl,x$gear), mean),而不是附加+1到基础上。附加是不好的编程实践,可能会导致以后出现大问题。 - Brandon Bertelsen
3
使用with(mtcars, tapply(hp, list(cyl, gear), mean))可以对mtcars数据集按照cyl和gear两个变量进行分组,并计算各组中hp变量的平均值。 - Martin Morgan

3

我将我的评论转换为回复,以便更好地编辑它。

我不确定如何使用xtabs(我以前从未使用过)进行操作,但是可以使用reshapeplyr包来执行此操作的几种方式。

> x = melt(mtcars, id = c("cyl", "gear"), measure = c("hp"))
> cast(x, cyl ~ gear, mean)

> x = ddply(mtcars, .(cyl, gear), summarise, hp = mean(hp))
> cast(x, cyl ~ gear)

0

另一种计算方法是使用aggregate()函数。虽然输出不是以表格形式呈现的。(via twitter)

> aggregate(hp~cyl+gear,data=mtcars,mean)
  cyl gear       hp
1   4    3  97.0000
2   6    3 107.5000
3   8    3 194.1667
4   4    4  76.0000
5   6    4 116.5000
6   4    5 102.0000
7   6    5 175.0000
8   8    5 299.5000
> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接