如何使用which.min和tapply确定绝对行号?

时间:2017-04-03 13:43:50

标签: r which tapply

(这是我的第一个问题,如果我没有正确询问,请告诉我,请分享一些关于如何改进我的问题提出技巧的反馈)

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

name v2 f1
  1. 名称是字符
  2. v2是数字
  3. f1是54级的因素
  4. 我想找到因子x的v2的最小位置。我尝试按如下方式使用tapply

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

    我得到的答案是这样的:

    FALSE  TRUE 
     2821    19
    

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

    ds[19, 1]
    

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

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

1 个答案:

答案 0 :(得分:0)

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, ]