【问题标题】:get location of row with median value in R data frame获取R数据框中具有中值的行的位置
【发布时间】:2019-01-16 16:50:46
【问题描述】:

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

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

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)

【问题讨论】:

  • 当x的中位数不是x中的值时,你想要什么结果?
  • 我认为最好的是该对中较低值的行号。 @JosephClarkMcIntyre
  • 我觉得你可以接受 IceCreamToucan 的回应,先对数据集进行排序。

标签: r dataframe row median


【解决方案1】:

这个问题有点不明确。

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

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

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

quantile 函数和 type = 1(即没有平均)也可能很有趣,具体取决于您想要的行为。它返回中位数的两个“边”中的较低者,而上面的 which.min 方法可以取决于数据的顺序。

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

使用quantile 的选项是

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

这可能会返回多个行号。

编辑: 如果你希望它只返回第一个匹配,你可以修改它,如下所示

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

【讨论】:

  • 你说得对——我没有想到第二种情况。我会及时补充细节。
  • 从你的意思来看,我假设quantile 不需要对数据进行先前的排序?
  • 嗨@IceCreamToucan - 感谢您的快速回答!为了保守起见,我更改了代码以选择最大值。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-05-12
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多