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

时间:2019-01-16 16:50:47

标签: r dataframe row median

我对这个基本问题有些困惑,但是我找不到解决办法。

我有两个数据框(下面的虚拟变量):

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]

的值

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

2 个答案:

答案 0 :(得分:2)

该问题有些不足。

  • 中位数不在数据中应该怎么办?
  • 如果中位数多次出现在数据中应该怎么办?

这是一个解决方案,它取每个值和中位数之间的(绝对)差,然后返回差向量达到其最小值的 first 行的索引。

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

带有quantile的{​​{1}}函数(即无求平均值)也可能会引起您的兴趣,这取决于您的期望行为。它返回中位数两个“边”中的较低者,而上面的type = 1方法可能取决于数据的顺序。

which.min

使用quantile(x$Col1, .5, type = 1) # 50% # 2 的选项是

quantile

这可能返回多个行号。

编辑:  如果只希望它返回第一个匹配项,则可以如下所示对其进行修改

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

答案 1 :(得分:1)

在这里,类似y$ColB[which(x$Col1 == round(median(x$Col1)))]的东西可以解决问题。

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

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