R的tapply函数中使用空函数

5
我有困难理解tapply函数在FUN参数为null时的作用。 文档中写到:

如果 FUN 为 NULL,则 tapply 返回一个向量,该向量可用于下标多维数组 tapply 正常生成。

例如,文档中以下示例是做什么用的?
ind <- list(c(1, 2, 2), c("A", "A", "B"))
tapply(1:3, ind) #-> the split vector

我不理解这些结果:

[1] 1 2 4

感谢您的选择。

1
请参考interaction(ind)函数生成所有"factor" "levels"的组合;在您的示例中,输出结果对应于levels(interaction(ind))[c(1, 2, 4)]按照"INDEX"参数进行匹配的"X"。另请参考tapply(1:5, list(c(1, 2, 2, 2, 1), c("A", "A", "B", "B", "A")))可以更清晰地看到,它将"X"按"INDEX"分组。 - alexis_laz
ix <- tapply(X, INDEX) 的结果不依赖于 X,只依赖于 INDEX。特别地,如果 INDEX 是一个列表,则 ix 等于 as.integer(do.call(interaction, INDEX)) - G. Grothendieck
1个回答

3
如果你使用指定的函数(非NULL)在tapply中运行,例如help中的sum,你会发现结果是一个有NA存在的二维数组:
res <- tapply(1:3, ind, sum)
res
   A  B
 1 1 NA
 2 2  3

这意味着缺少一个因素组合,即(1,B)。当FUN为空时,它返回与所有现有因素组合相对应的向量索引。要检查这个:
> which(!is.na(res))
[1] 1 2 4

需要提醒的是,指定函数本身可能会返回NA,就像下面的简单示例:

> f <- function(x){
      if(x[[1]] == 1) return(NA)
      return(sum(x))
  }
> tapply(1:3, ind, f)
   A  B
1 NA NA
2  2  3

因此,通常情况下,“NA”并不意味着因素组合不存在。

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