在R中,tapply和aggregate有什么区别?

4
Aaa <- data.frame(amount=c(1,2,1,2,1,1,2,2,1,1,1,2,2,2,1), 
                  card=c("a","b","c","a","c","b","a","c","b","a","b","c","a","c","a"))

aggregate(x=Aaa$amount, by=list(Aaa$card), FUN=mean)

##   Group.1    x
## 1       a 1.50
## 2       b 1.25
## 3       c 1.60

tapply(Aaa$amount, Aaa$card, mean)

##    a    b    c 
## 1.50 1.25 1.60 

上面是一个示例代码。

看起来aggregatetapply都非常方便,并且执行类似的功能。

有人能解释一下它们之间的区别或给出示例吗?


1
你刚刚给出了例子。仔细检查它们。如果你将输出保存在一个变量中,你可以首先查看classsummary和结构(str)。 - John
1个回答

16

aggregate是设计用于使用一个函数处理多个列,并返回每个类别的一个行的数据框,而tapply则是设计用于使用一个函数处理单个向量并将结果作为矩阵或数组返回。仅使用两列矩阵无法真正展示任一函数的能力(或它们的显著差异)。aggregate还具有公式方法,而tapply没有。

> Aaa <- data.frame(amount=c(1,2,1,2,1,1,2,2,1,1,1,2,2,2,1), cat=sample(letters[21:24], 15,rep=TRUE),
+                   card=c("a","b","c","a","c","b","a","c","b","a","b","c","a","c","a"))
> with( Aaa, tapply(amount, INDEX=list(cat,card), mean) )
    a   b   c
u 1.5 1.5  NA
v 2.0 1.0 2.0
w 1.0  NA 1.5
x 1.5  NA 1.5

>  aggregate(amount~cat+card, data=Aaa, FUN= mean) 
  cat card amount
1   u    a    1.5
2   v    a    2.0
3   w    a    1.0
4   x    a    1.5
5   u    b    1.5
6   v    b    1.0
7   v    c    2.0
8   w    c    1.5
9   x    c    1.5

xtabs 函数也会生成一个 R 的 "表格",并且它具有公式接口。R 表格是矩阵,通常具有整数值,因为它们被设计成 "列联表",用于保存边际类别的交叉分类中项目的计数。


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