R中的中值-返回舍入数字

时间:2019-04-01 18:38:36

标签: r median

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

例如,仅查看一个,我想使用:

    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

我想通过将返回的中位数与列中的平均值相匹配来找到中位数记录,但是这种返回不可能。

我找到了一些有关使用mean函数进行四舍五入的文档和问题,但不幸的是,这似乎并不适用于此。

我还可以限制数据的小数位,但是某些记录会太接近,如果四舍五入到小数点,则重复项很常见。

2 个答案:

答案 0 :(得分:0)

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

library(dplyr)

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

答案 1 :(得分:0)

当输入中有偶数个值(如您拥有的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)
}