如何使用 which.min 确定绝对行号并点击?

How to determine absolute row number using which.min and tapply?

我的数据集名为 ds,是一个包含三列和 4000 多个观察值的矩阵。 ds 中的三列是:

name v2 f1
  1. 名字是角色
  2. v2 是数字
  3. f1 是 54 级的因子

我想找到因子 x 的 v2 的最小值位置。我尝试如下使用 tapply

tapply(ds$v2, ds$f1 == x, which.min)

我得到的答案是这样的:

FALSE  TRUE 
 2821    19

我假设 19 是我数据集中的绝对位置,如果我想找到观察的名称,我需要做的就是

ds[19, 1]

但显然这是不正确的。我知道 19 对应于相对位置,即它是因子 x 的第 19 个观察值。

所以我的问题是:如何找到因子 x 的最小值的绝对位置?

tapply 会将函数应用于第二个参数的每个唯一值,因此您不应该使用 ds$f1 == x 并且可能只使用 ds$f1 所以它看起来像:

tapply(ds$v2, ds$f1 == x, which.min)

这里以R自带的鸢尾花数据集为例:

tapply(iris$Sepal.Length, iris$Species, which.min)

编辑:

但是,正如您所指出的,这将为您提供子集数据中的位置,而不是绝对位置。

我认为不可能从 tapply 中获得绝对值,因为您正在处理单个向量。如果你想一次处理多个列,你可以使用这种方法:

d <- split(iris, iris$Species)
row_positions <- sapply(d, function(x) rownames(x[which.min(x$Sepal.Length), ]))
iris[row_positions, ]