获取 R 数据框中具有中值的行的位置

get location of row with median value in R data frame

我有点被这个基本问题困住了,但找不到解决方案。

我有两个数据框(下面的假人):

x<- data.frame("Col1"=c(1,2,3,4), "Col2"=c(3,3,6,3))
y<- data.frame("ColA"=c(0,0,9,4), "ColB"=c(5,3,20,3))

我需要使用 df x 中一列的中值位置,然后从 df y 中检索一个值。为此,我正在尝试获取中值的行号,例如x$Col1 然后使用 y[,"ColB"][row.number]

之类的东西检索值

是否有优雅的 way/function 可以做到这一点?解决方案可能需要考虑两种情况 - 当样本具有偶数个值时,而且这是不均匀的(当数字是偶数时,由于计算平均值,中值可能是在样本中找不到的值the two values in the middle)

在这里,像 y$ColB[which(x$Col1 == round(median(x$Col1)))] 这样的东西就可以了。

问题是 x 的行数是偶数,所以中位数 2.5 不是整数。在这种情况下,您必须在 23 之间进行选择。

注意:以上适用于您的示例,不适用于一般情况(例如 c(-2L,2L) 或有理数)。对于更一般的情况,请参阅@IceCreamToucan 的解决方案。

问题有点不明确。

  • 当中位数不在数据中时会发生什么?
  • 如果中位数多次出现在数据中会怎样?

这是一个解决方案,它采用每个值与中位数之间的(绝对)差异,然后 returns 是 first 行的索引,该差异向量达到最小值。

with(x, which.min(abs(Col1 - median(Col1))))
# [1] 2

具有 type = 1quantile 函数(即无平均)也可能会引起您的兴趣,具体取决于您想要的行为。它 return 是两个 "sides" 中位数中较低的一个,而上面的 which.min 方法可能取决于数据的顺序。

quantile(x$Col1, .5, type = 1)
# 50% 
#   2 

使用quantile的一个选项是

with(x, which(Col1 == quantile(Col1, .5, type = 1)))
# [1] 2

这可能 return 多个行号。

编辑: 如果你想让它只return第一个匹配,你可以修改它如下所示

with(x, which.min(Col1 != quantile(Col1, .5, type = 1)))