【问题标题】:How to determine absolute row number using which.min and tapply?如何使用 which.min 和 tapply 确定绝对行号?
【发布时间】:2017-08-28 09:59:50
【问题描述】:

我的数据集名为 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 对此非常混乱,比如tapply(1:nrow(iris), iris$Species, function(i) i[which.min(iris$Sepal.Length)])。如果您愿意使用 dplyr 或 data.table 之类的包,则可以使用一些更直观的语法。或者,by() 函数可能会有所帮助:stackoverflow.com/a/24070835

标签: r tapply


【解决方案1】:

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

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

下面是 R 自带的 iris 数据集示例:

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

【讨论】:

  • 这仍然给出子组内的行号,而不是整个表。试试iris[tapply(iris$Sepal.Length, iris$Species, which.min), ]看看问题。
  • 感谢@Frank 指出这一点,我误解了这个问题。我编辑了我的答案。
  • 谢谢@sinQueso 我做了类似的事情,这很有帮助。我使用 split 像这样拆分 ds:y &lt;- split(ds, ds$f1 == x)$'TRUE'。这创建了一个基于因子的矩阵。我运行 which.min 然后得到了想要的输出。
猜你喜欢
  • 2016-04-23
  • 2020-08-24
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多