【问题标题】:Mean of means with a subset具有子集的均值
【发布时间】:2016-04-17 11:19:49
【问题描述】:

想象一个数据表

ID    Score
1     10
1     13
1     12
2     10
3     6
3     6

用户 1 的平均值为 11.67。用户 2 的平均值为 10。用户 3 的平均值为 6。

我正在寻找的 UniqAverage 是 ((11.67+10+6)/3) =9.223`

出于复制目的,请随意使用...

library(data.table)
df = data.frame( ID=c(1,1,1,2,3,3), Score1=c(10,13,12,10,6,6) ) 
dt = data.table(df)

上一个问题让我知道我可以做到

dt[, mean(Score1), ID][,mean(V1)]

按 ID 获取平均值。

但是,如果我只想要分数的平均值 > 10 怎么办?

所以我会结束

ID    V1
1     12.5
2     0
3     0

所以我的最终结果是4.167

尝试使用失败。

dt[, mean( which(Score1) > 10 ), ID][,mean(V1)]

【问题讨论】:

  • 在大多数(如果不是全部)情况下,不建议计算平均值。见ksrowell.com/blog-visualizing-data/2014/05/09/…
  • 是的。这比我所拥有的要简单得多。我现在通过 dt[ dt[,Score1>10], mean(Score1), ID] 让它工作了
  • 你可以构造一个像dt = data.table(...)这样的例子。无需以df = data.frame(..)开头。
  • 为什么是dt[ dt[,Score1>10], mean(Score1), ID]?为什么不dt[Score1>10, mean(Score1), ID]

标签: r data.table


【解决方案1】:

通过“ID”获得“Score1”的mean,其中“Score1”大于10,我们可以在具有unique“ID”的数据集上join

dt1 <- dt[Score1>10, .(V1= mean(Score1)), by = ID
          ][data.table(ID= unique(dt$ID)), on = "ID"][is.na(V1), V1 :=0][]
dt1
#   ID   V1
#1:  1 12.5
#2:  2  0.0
#3:  3  0.0

dt1[, mean(V1)]
#[1] 4.166667

【讨论】:

    【解决方案2】:

    这是一个基于 R 和 aggregate 的解决方案:

    x <- aggregate(df, list(df$ID), function(x) mean(ifelse(x > 10, x, NA), na.rm = T))[,3]
    mean(ifelse(is.na(x), 0, x))
    

    【讨论】:

    • 最后一行mean(ifelse(is.na(x), 0, x)),我不确定平均值 0 是否是进一步计算平均值的预期值。用在非 NA 上计算的均值替换它可能会更好。
    • 我认为它遵循了 Jibril 想要的输出。对于ID 2 和3,没有Score > 10 的情况,这些组的“平均值”为0。
    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 2016-04-16
    • 2017-06-12
    • 2017-12-10
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多