有没有办法使用聚合命令按组计算不对称平均值(例如从百分位数 0.05 到 0.5)? R-工作室

Posted

技术标签:

【中文标题】有没有办法使用聚合命令按组计算不对称平均值(例如从百分位数 0.05 到 0.5)? R-工作室【英文标题】:Is there a way to calculate an asymmetrical mean (e. g. from percentile 0.05 to 0.5) by group using the aggregate command? R-STUDIO 【发布时间】:2019-12-29 07:51:31 【问题描述】:

我正在对一组价格数据计算 Tukey 异常值检测算法。

问题是我需要按组计算它(同一数据集中包含的另一个变量),这与 aggregate 命令完美匹配,直到我需要仅使用百分位数之间的数据计算平均值5 到中位数,1 只使用中位数到百分位数 95 的数据。

据我所知,命令是这样的:aggregate(doc$x, by=list(doc$group), FUN=mean, trim = 0.05),如果平均值被对称修剪,则在打印前从数据中取上下 5%(总共 10%)结果。 我不知道如何进行接下来的步骤,我需要计算以中位数为分割点的上下均值,仍然保持上下 5% 的折扣。

medlow <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim =c(0.05,0.5))
medup <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim =c(0.5,0.95))

medtrunc <- aggregate(doc1$`rp`, by=list(doc1$`Código Artículo`), FUN=mean,trim = 0.05)

我希望输出是我需要的每个组的数字,但它会发生

mean.default(X[[i]], ...) 中的错误:“trim”必须是长度为 1 的数字。

【问题讨论】:

【参考方案1】:

首先,我认为您以错误的方式使用 aggregatetrim'trim' must be numeric of length one 表示您只能从分布的上尾和下尾中排除特定部分的数据:

df = data.frame(
  gender = c(
    "male","male","male","male","female","female","female", "female"
    ),
  score = rnorm(8, 10, 2)
  )
aggregate(score ~ gender, data = df, mean, trim = 0.1)

  gender     score
1 female 11.385263
2   male  9.954465

对于基于中值的拆分并计算拆分数据的修剪均值,您可以通过简单的 for 循环创建新变量 MedianSplit 来轻松拆分数据框:

df$MedianSplit <- 0
for (i in 1:nrow(df)) 
  if (df$score[i] <= median(df$score)) 
    df$MedianSplit[i] = "lower" 
   else 
    df$MedianSplit[i] = "upper"
  


df



gender     score MedianSplit
1   male  7.062605       lower
2   male  9.373052       upper
3   male  6.592681       lower
4   male  7.298971       lower
5 female  7.795813       lower
6 female  7.800914       upper
7 female 12.431028       upper
8 female 10.661753       upper

然后,使用aggregate 计算修剪后的均值:

对于低于中位数的数据([0, 0.5]

aggregate(
  score ~ gender, 
  data = df[ which(df$MedianSplit == "lower"), ], 
  mean, trim = 0.05
)

  gender    score
1 female 7.795813
2   male 6.984752

对于中位数以上的人( [0.5, 1]):

聚合( 得分〜性别, 数据 = df[ 其中(df$MedianSplit == "upper"), ], 平均,修剪 = 0.05 )

  gender     score
1 female 10.297898
2   male  9.373052

【讨论】:

为了使它适合,假设你有来自不同地方的男性和女性,总共 270 个。所以你想得到每个地方的所有这些数字,这就是为什么我试图使用“聚合”来帮助我简化编码。另外,最后,修剪不匹配,因为我需要从 0.05 到中位数 (0.5) 的平均值,而不是 0.45,上侧也是如此。 @MelaniaCB 请编辑您的问题并使用dput 提供一个最小示例。如果您有两个或更多分类变量,使用dplyrgroup_by 后跟mutate_at 将比您想象的更有帮助。我认为tidyverse 方法适合您的情况 可以通过创建函数 infmean x, by=list(doc$Group), FUN=infmean)

以上是关于有没有办法使用聚合命令按组计算不对称平均值(例如从百分位数 0.05 到 0.5)? R-工作室的主要内容,如果未能解决你的问题,请参考以下文章

R:按组计算多个相关性(并将输出保存到 csv 文件)

pandas groupby 可以聚合成一个列表,而不是 sum、mean 等吗?

合并多个平均值而不计算总计

Matlab使用 MapReduce 按组计算均值

在SQL中按组计算移动平均数

在Oracle中按组不使用聚合函数或行到列