【问题标题】:R - modify order of levels in tapply functionR - 修改 tapply 函数中的级别顺序
【发布时间】:2013-11-26 01:17:36
【问题描述】:

我的数据如下所示

nums      r     a
1 3     210     0
4 6     3891    1
9 8     891     1
1 3     321     1
8 1     32      0
etc     etc     etc

我想计算一些东西,想知道是否有人可以帮助提供以下代码

  1. 每个 nums 值的平均 a 值(例如,上面,1 3 的平均 a0.5),按最高平均 a 值排序。我在想tapply 会解决这个问题,但我不知道如何处理排序组件。
  2. 每个nums 值的平均a 值,按预定的nums 顺序排序。例如,tapply(df$ac, df$nums, mean, orderBy=c("1 3", "4 6", "8 1", etc.)) 之类的东西。您可以假设我的排序涵盖了所有可能的 nums 值。

【问题讨论】:

    标签: r dataframe tapply


    【解决方案1】:

    使用tapply

    agg <- with(data, tapply(a, nums, FUN = mean))
    

    那么对于 1,做:

    sort(agg, decreasing = TRUE)
    

    对于 2,执行:

    agg[predetermined.nums]
    

    你也可以使用aggregate:

    agg <- aggregate(a ~ nums, data, FUN = mean)
    

    那么对于 1,做:

    agg[order(agg$a, decreasing = TRUE), ]
    

    对于 2,执行:

    agg[match(predetermined.nums, agg$nums), ]
    

    【讨论】:

    • 对于 tapply,#2 不起作用。对于聚合,#2 有效,但它作为数据帧输出,而不是作为 tapply 通常输出。
    • 很难说,因为你没有提供一个可重复的例子......你能自己弄清楚吗?毕竟是简单的索引。
    • 对你来说可能很简单,但我对 R 有点陌生。你能重新格式化你的聚合方法的输出,让它看起来像一个 tapply 调用的输出吗?
    • 你很可能有一个因素,所以试试agg[as.character(predetermined.nums)]。今后,请提供一个可重现的示例,并尝试提供比“它不起作用”更有用的反馈。
    • 可重现的例子:data = data.frame(nums=c("1 2 3","4 3 2","2 5 2","4 3 2"),a=c( 1,0,1,1)); agg=aggregate(a~nums,data,FUN=mean); agg[unique(data$nums)];
    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多