fra*_*nkc 21 r aggregate-functions
我理解tapply()在R中做了什么.但是,我无法从文档中解析它的描述:
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.也许有人可以帮我解析一下吗?
jor*_*ran 19
让我们看看R文档中有关该主题的内容:
向量和标记因子的组合是有时被称为不规则数组的一个例子,因为子类大小可能是不规则的.当子类大小都相同时,索引可以隐式且更有效地完成,正如我们在下一节中看到的那样.
您通过INDEX
一起提供的因子列表指定了X
可能不同长度的子集集合(因此,"粗糙"描述符).然后FUN
应用于每个子集.
编辑:@Joris在评论中提出了一个很好的观点.这可能是认为有帮助的tapply(X,Y,...)
,作为一个包装sapply(split(X,Y),...)
中,如果Y为分组因素清单,它构建基于其独特的水平一个新的,单一的分组因素,相应地分配X和应用乐趣,每件.
编辑:这是一个说明性的例子:
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))
Run Code Online (Sandbox Code Playgroud)
Nic*_*bbe 18
@joran的好回答帮助我理解了(所以请投票给他 - 我会把它添加为评论,如果它不是太久了),但这可能对某些人有所帮助:
在很多语言中,你有两维数组.根据语言的不同,这些数组具有固定的维度(即:每行具有相同的列数),或者某些语言允许每行的项数不同.所以代替:
A: 1 2 3
B: 4 5 6
C: 7 8 9
Run Code Online (Sandbox Code Playgroud)
你可以得到类似的东西
A: 1 3
B: 4 5 6
C: 8
Run Code Online (Sandbox Code Playgroud)
这被称为一个参差不齐的数组,因为它的右侧看起来很粗糙.在典型的R风格中,我们可能将其表示为两个向量:
values<-c(1,3,4,5,6,8)
names<-c("A", "A", "B", "B", "B", "C")
Run Code Online (Sandbox Code Playgroud)
因此,tapply
使用这两个向量作为第一个参数确实允许我们将此函数应用于我们的不规则数组的每个"行".