我理解t中的tapply()做了什么。但是,我无法从文档中解析它的描述:
Apply a Function Over a "Ragged" Array Description: Apply a function to each cell of a ragged array, that is to each (non-empty) group of values given by a unique combination of the levels of certain factors. Usage: tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
当我想到tapply时,我想到了sql中的group by。您可以通过INDEX中的并行因子级别将X中的值组合在一起,并将FUN应用于这些组。我已经阅读了100次tapply的描述,仍然无法弄清楚它所说的如何映射到我如何理解tapply。也许有人可以帮我解析它?
答案 0 :(得分:19)
让我们看看R documentation关于这个主题的内容:
向量和标记因子的组合是有时被称为参差不齐的数组的一个例子,因为子类大小可能是不规则的。当子类大小都相同时,索引可以隐式且更有效地完成,如下一节所示。
您通过INDEX
提供的因子列表一起指定了X
的子集合,这些子集可能具有不同的长度(因此,“不规则”描述符)。然后FUN
应用于每个子集。
tapply(X,Y,...)
视为sapply(split(X,Y),...)
的包装可能会有所帮助,因为如果Y是分组因子列表,它会根据其唯一级别构建一个新的单个分组因子,相应地拆分X和对每件作品都应用FUN。
编辑:这是一个说明性的例子:
library(lattice)
library(plyr)
set.seed(123)
#Make this example unbalanced
dat <- barley[sample(1:120,50),]
#Suppose we want the avg yield by year/site:
table(dat$year,dat$site)
#That's what they mean by 'ragged' array; there are different
# numbers of obs at each comb of levels
#In plyr we could use ddply:
ddply(dat,.(year,site),.fun=function(x){mean(x$yield)})
#Which gives the same result (listed in a diff order) as:
melt(tapply (dat$yield, list (dat$year, dat$site), mean))
答案 1 :(得分:18)
在很多语言中,你有两维数组。根据语言的不同,这些数组具有固定的尺寸(即:每行具有相同的列数),或者某些语言允许每行的项数不同。所以而不是:
A: 1 2 3
B: 4 5 6
C: 7 8 9
你可以得到像
这样的东西A: 1 3
B: 4 5 6
C: 8
这被称为一个参差不齐的数组,因为它的右侧看起来很粗糙。 在典型的R风格中,我们可能将其表示为两个向量:
values<-c(1,3,4,5,6,8)
names<-c("A", "A", "B", "B", "B", "C")
因此tapply
将这两个向量作为第一个参数确实允许我们将此函数应用于我们的不规则数组的每个“行”。