【问题标题】:R's tapply with null functionR的带有null功能的tapply
【发布时间】:2016-05-23 12:39:03
【问题描述】:

FUN 参数为null 时,我无法理解tapply 函数的作用。

documentation 说:

如果 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

谢谢。

【问题讨论】:

  • 参见interaction(ind),它会生成“因子”“级别”的所有组合;在您的示例中,根据“INDEX”参数,您得到的输出对应于levels(interaction(ind))[c(1, 2, 4)] 中的“X”匹配。另请参阅tapply(1:5, list(c(1, 2, 2, 2, 1), c("A", "A", "B", "B", "A"))),可以更清楚地看到tapply 按“索引”分组“X”
  • ix &lt;- tapply(X, INDEX) 的结果不依赖于X -- 仅依赖于INDEX -- 特别是,如果INDEX 是一个列表,那么ix 等于as.integer(do.call(interaction, INDEX))

标签: r tapply


【解决方案1】:

如果您使用指定的函数(非 NULL)运行 tapply,例如 sum,就像在帮助中一样,您会看到结果是一个二维数组,其中 NA 在一个单元格中:

res <- tapply(1:3, ind, sum)
res
   A  B
 1 1 NA
 2 2  3

表示不存在一种因素组合,即(1,B)。当 FUN 为 NULL 时,它返回对应于所有当前因子组合的向量索引。要检查这个:

> 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 并不意味着不存在因子组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 2015-04-22
    • 2012-11-09
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多