获取 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
不是整数。在这种情况下,您必须在 2
或 3
之间进行选择。
注意:以上适用于您的示例,不适用于一般情况(例如 c(-2L,2L)
或有理数)。对于更一般的情况,请参阅@IceCreamToucan 的解决方案。
问题有点不明确。
- 当中位数不在数据中时会发生什么?
- 如果中位数多次出现在数据中会怎样?
这是一个解决方案,它采用每个值与中位数之间的(绝对)差异,然后 returns 是 first 行的索引,该差异向量达到最小值。
with(x, which.min(abs(Col1 - median(Col1))))
# [1] 2
具有 type = 1
的 quantile
函数(即无平均)也可能会引起您的兴趣,具体取决于您想要的行为。它 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)))
我有点被这个基本问题困住了,但找不到解决方案。
我有两个数据框(下面的假人):
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
不是整数。在这种情况下,您必须在 2
或 3
之间进行选择。
注意:以上适用于您的示例,不适用于一般情况(例如 c(-2L,2L)
或有理数)。对于更一般的情况,请参阅@IceCreamToucan 的解决方案。
问题有点不明确。
- 当中位数不在数据中时会发生什么?
- 如果中位数多次出现在数据中会怎样?
这是一个解决方案,它采用每个值与中位数之间的(绝对)差异,然后 returns 是 first 行的索引,该差异向量达到最小值。
with(x, which.min(abs(Col1 - median(Col1))))
# [1] 2
具有 type = 1
的 quantile
函数(即无平均)也可能会引起您的兴趣,具体取决于您想要的行为。它 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)))