解释R tapply描述

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)

  • 值得注意的是,`tapply(X,Y,...)`实际上只不过是`sapply(split(X,Y),...)`的包装器,它更清楚地说明了粗糙的数组. (6认同)

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使用这两个向量作为第一个参数确实允许我们将此函数应用于我们的不规则数组的每个"行".

  • @joran:如果你做`split(values,names)`你会得到一个破烂的数组.如果你查看`tapply`的源代码,你会看到它确实如此,然后在获得的列表上使用`sapply`. (3认同)
  • +1很好.我认为让我们感到困惑的是(当我第一次阅读`tapply`文档时包括我)是我立即想到如果我以"参差不齐"的形式存在它,为什么我不将它存储在`列表中(A = c) (1,3),B = c(4,5,6),C = 8)`并使用`lapply`?对我来说,关键是要意识到当你以"长"的形式组织数据时它很有用,比如通过cbind-ing`values`和`names`. (2认同)