2017-04-03 46 views
1

(这是我的第一个问题,所以请让我知道,如果我没有问它正确,并请您分享我如何能提高我的问题问的技能的一些反馈)如何使用which.min和tapply确定绝对行号?

我的数据集,名为DS,是一个具有三列和4000+观察值的矩阵。 DS中的三列分别是:

name v2 f1 
  1. 名字是性格
  2. v2是数字
  3. F1是与54个水平

我想找到最小的位置因素对于因子x的v2。我试过如下

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

使用tapply我得到的答案是这样的:

FALSE TRUE 
2821 19 

我推测,19是我的数据集的绝对位置,如果我想找到的名称我需要做的全部观察是

ds[19, 1] 

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

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

+2

请提供一个小的数据集摘要和所需的输出基于它,你的问题将成为一个好问题。 – nicola

+0

我想'tapply'是这个相当混乱,像'tapply(1:nrow(光圈),虹膜$种类,功能(我)我[which.min(虹膜$ Sepal.Length))'。如果你愿意使用像dplyr或data.table这样的包,可以使用更直观的语法。或者,'by()'函数可能有所帮助:http://stackoverflow.com/a/24070835/ – Frank

回答

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

这仍然给予子组内的行号而不是整个表。试试'iris [tapply(iris $ Sepal.Length,iris $ Species,which.min)]'来查看问题。 – Frank

+1

感谢您指出@Frank,我误解了这个问题。我编辑了我的答案。 – sinQueso

+0

谢谢@sinQueso我做了类似的事情,帮助。我用这样拆分ds:'y < - split(ds,ds $ f1 == x)$'TRUE''。这创建了一个基于该因素的矩阵。我运行了.min,然后获得了所需的输出。 –