解释 R tapply 描述

Posted

技术标签:

【中文标题】解释 R tapply 描述【英文标题】:Explain R tapply description 【发布时间】:2011-09-11 22:28:53 【问题描述】:

我了解 tapply() 在 R 中的作用。但是,我无法从文档中解析它的描述:

在“参差不齐”的数组上应用函数 描述: 将函数应用于参差不齐的数组的每个单元格,即每个 (非空)由唯一组合给出的值组 某些因素的水平。 用法: tapply(X, INDEX, FUN = NULL, ..., 简化 = TRUE)

当我想到tapply时,我想到了sql中的group by。您可以通过 INDEX 中的平行因子水平将 X 中的值组合在一起,并将 FUN 应用于这些组。我已经阅读了 tapply 的描述 100 次,但仍然无法弄清楚它所说的内容如何映射到我对 tapply 的理解。也许有人可以帮我解析一下?

【问题讨论】:

好问题。我也对同样的事情感到困惑。 感谢与group by 的类比。这本身就很有帮助。 【参考方案1】:

@joran 的出色回答帮助我理解了它(所以请为他投票 - 如果它不是太长的话,我会添加它作为评论),但这可能对某些人有所帮助:

在很多语言中,都有二维数组。根据语言的不同,这些数组具有固定的维度(即:每行具有相同的列数),或者某些语言​​允许每行的项目数不同。所以而不是:

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

【讨论】:

+1 不错。我认为让人们(包括我第一次阅读 tapply 文档时的我)感到困惑的是,我立即认为如果我以“衣衫褴褛”的形式拥有它,我为什么不将它存储在 list(A=c(1,3),B=c(4,5,6),C=8) 中并使用 @ 987654327@?对我来说,关键是要意识到当您以“长”形式组织数据时它很有用,例如 cbind-ing valuesnames @joran :如果你这样做 split(values,names) 你会得到参差不齐的数组。如果您查看tapply 的源代码,您会发现它正是这样做的,然后在获得的列表上使用sapply @Joris - 是的;大多数混淆来自文档的措辞(恕我直言)。一旦您查看源代码,就很清楚发生了什么。但当我第一次读到那篇文章时,我肯定会摸不着头脑,不知道他们所说的参差不齐的数组是什么意思。【参考方案2】:

让我们看看R documentation 在这个问题上是怎么说的:

向量和标签因子的组合是有时被称为不规则数组的一个例子,因为子类的大小可能是不规则的。当子类大小都相同时,索引可以隐式完成并且效率更高,我们将在下一节中看到。

您通过INDEX 提供的因子列表一起指定了X 的子集的集合,这些子集的长度可能不同(因此称为“不规则”描述符)。然后将FUN 应用于每个子集。

编辑:@Joris 在 cmets 中提出了一个很好的观点。将 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))

【讨论】:

很高兴注意到tapply(X,Y,...) 本质上只不过是sapply( split(X,Y), ...) 的一个包装器,它相当清楚地说明了参差不齐的数组。

以上是关于解释 R tapply 描述的主要内容,如果未能解决你的问题,请参考以下文章

什么是 R 中 plyr::ldply(tapply) 的 dplyr 等价物?

R函数之:apply(), lapply(), sapply(), tapply()

R语言apply函数详解及实战(lapply, sapply, vapply, tapply,mapply)

r语言apply函数与tapply函数有啥区别

R apply() 函数和 tapply() 函数

在tapply或R中使用近似函数