我对这个基本问题有些困惑,但是我找不到解决办法。
我有两个数据框(下面的虚拟变量):
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)
答案 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
不是整数。在这种情况下,您必须在2
或3
之间进行选择。
注意:以上内容仅适用于您的示例,不适用于一般情况(例如c(-2L,2L)
或有理数)。有关更一般的情况,请参见@IceCreamToucan的解决方案。