【问题标题】:Medians Values in R - Returns Rounded NumberR中的中值 - 返回四舍五入的数字
【发布时间】:2019-08-23 00:01:16
【问题描述】:

我有一个数据表,其中我根据它们所属的集群标记了行,并计算了行列值的平均值。我想为每个集群选择中间行。

例如,只看一个,我想用:

    median(as.numeric(as.vector(subset(df,df$cluster == i )$avg))) 

我看出来了

> as.numeric(as.vector(subset(df,df$cluster == i )$avg))
 [1] 48.11111111 47.77777778 49.44444444 49.33333333 47.55555556 46.55555556 47.44444444 47.11111111 45.66666667 45.44444444

然而,中位数是

> median(as.numeric(as.vector(subset(df,df$cluster == i )$avg)))
[1] 47.5

我想通过将返回的中值与列中的平均值进行匹配来找到中值记录,但使用此返回值是不可能的。

我找到了一些关于使用均值函数舍入的文档和问题,但不幸的是,这似乎并不适用。

我也可以限制数据的小数位,但有些记录会太接近,如果四舍五入到小数点后重复将很常见。

【问题讨论】:

  • 当输入有偶数个值(比如你有 10 个值)时,中间没有直接值。在偶数输入的情况下,中位数(R 实现)averages the two middle values 的标准定义。您可以rank 数据,并且在偶数长度输入的情况下选择n/2n/2 + 1 记录。

标签: r median


【解决方案1】:

当输入具有偶数个值(例如您拥有的 10 个值)时,中间没有直接值。在偶数输入的情况下,中位数(R 实现)averages the two middle values 的标准定义。您可以rank 数据,并且在偶数长度输入的情况下选择n/2n/2 + 1 记录。

因此,如果您的数据是x = c(8, 6, 7, 5),则中位数为6.5. 您似乎想要“中位数”的索引,即 2 或 3。

如果我们假设没有关系,那么我们可以得到这些答案

which(rank(x) == length(x) / 2)
# [1] 2
which(rank(x) == length(x) / 2 + 1)
# [1] 3

如果平局可能,那么rank 的默认平局打破方法会给您带来一些问题。查看?rank 并确定您想使用哪个选项。

当然,我们可以把它变成一个小实用函数:

median_index = function(x) {
  lx = length(x)
  if (lx %% 2 == 1) {
    return(match(median(x), x))
  }
  which(rank(x, ties.method = "first") == lx/2 + 1)
}

【讨论】:

  • 我认为这种方法可行。它比我希望的要麻烦一些,尤其是在没有创建额外对象的情况下。我得到了我正在寻找的结果 as.numeric(as.vector(subset(df,df$cluster == i )$avg))[which(rank(as.numeric(as.vector(subset(df,df $cluster == i )$avg))) == length(as.numeric(as.vector(subset(df,df$cluster == i )$avg))) / 2)] 'Result=' 47.44444444跨度>
  • 重复as.numeric(as.vector()) 似乎也很麻烦。只需将avg 设为数据框中的数字列,您就可以停止一次又一次地输入转换。如果您使用dplyrdata.table(如果您想留在base 中,甚至是aggregate),这将是一行或两行,而不是带有subset 的for 循环。查看Calculate mean by group R-FAQ 并使用自定义中值函数而不是mean
  • 在您的函数中发现了一个错误。 which 应该与您的 length(x) / 2 + 1 计算相匹配。如当前所写,您的 else 条件将始终返回向量的最后一个元素。应该是which(rank(x, ties.method = "first") == (lx/2+1))
【解决方案2】:

有一种更简单的方法:使用 dplyr

library(dplyr)

df%>%
group_by(cluster)%>% 
summarise(Median=median(avg))

【讨论】:

  • 这是一个很好的选择,它提供了一种更容易解决问题的方法,但最终并没有解决我的问题。我想选择/查找/标记具有中位数平均值的行。如果有偶数,我希望它选择第一个。您的代码建议产生: cluster Median 1 1 47.5 2 2 53.9 3 3 43.4 4 4 60.4 这很好,但我仍然无法将集群的中位数与特定行匹配(ie47.5 won' t 匹配 47.4444,这似乎是中值。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多