【问题标题】:What is the difference between the functions tapply and ave?函数tapply和ave有什么区别?
【发布时间】:2014-03-09 22:47:25
【问题描述】:

我无法将注意力集中在ave 函数上。我阅读了帮助并搜索了网络,但我仍然无法理解它的作用。我知道它在观察子集上应用了一些功能,但与 tapply

的方式不同

有人可以举个小例子来启发我吗?

谢谢,请原谅我提出了一个不寻常的要求。

【问题讨论】:

    标签: r aggregate tapply


    【解决方案1】:

    tapply 为每个因子水平返回一个结果。 ave 也会为每个因子级别生成一个结果,但它会将这个值复制到原始数据中的每个位置。

    ave 可以方便地在包含摘要数据的数据框中生成新列。

    一个简短的例子:

    tapply(iris$Sepal.Length, iris$Species, FUN=mean)
        setosa versicolor  virginica 
         5.006      5.936      6.588 
    

    一个值,每个因子水平的平均值。

    ave on iris 产生 150 个结果,与原始数据框一致:

     ave(iris$Sepal.Length, iris$Species, FUN=mean)
      [1] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
     [17] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
     [33] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
     [49] 5.006 5.006 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
     [65] 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
     [81] 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
     [97] 5.936 5.936 5.936 5.936 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
    [113] 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
    [129] 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
    [145] 6.588 6.588 6.588 6.588 6.588 6.588
    

    如 cmets 中所述,此处将回收单个值以填充原始数据中的每个位置。

    如果函数返回多个值,则在必要时将这些值回收以填充位置。例如:

    d <- data.frame(a=rep(1:2, each=5), b=1:10)
    ave(d$b, d$a, FUN=rev)
     [1]  5  4  3  2  1 10  9  8  7  6
    

    感谢 Josh 和 thelatemail。

    【讨论】:

    • 糟糕。在没有看到您的情况下发布了我自己的答案(现已删除)。我建议进行一个小修正,即avetapply 都不需要每个因子水平产生一个结果。设置FUN=cumsum 或类似的,以查看。
    • tapply 确实会在每个因子水平上产生一个结果。这个结果可能只是多个值、列表、其他对象等。ave 也可以返回多个值,并且如果返回的值的数量与输入向量的长度匹配,就会这样做(可能是明智的)。例如ave(1:10,rep(1:2,each=5),FUN=rev)
    • 我建议使用rep(1:2, 每个 =5) 为例。它可以更轻松地识别组内的倒车。
    • @thelatemail 是的,这样更好。
    • 也可能与聚合函数混淆
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2020-11-27
    • 2021-10-24
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多