R 如何使用which.min和tapply确定绝对行数?
我的数据集名为ds,是一个包含三列和4000多个观测值的矩阵。 ds中的三列为:R 如何使用which.min和tapply确定绝对行数?,r,tapply,R,Tapply,我的数据集名为ds,是一个包含三列和4000多个观测值的矩阵。 ds中的三列为: name v2 f1 名字就是字符 v2是数字的 f1是54级的系数 我想找到因子x的v2的最小值的位置。我试着使用tapply,如下所示 tapply(ds$v2, ds$f1 == x, which.min) 我得到的答案是这样的: FALSE TRUE 2821 19 我假设19是我的数据集中的绝对位置,如果我想找到观察的名称,我需要做的就是 ds[19, 1] 但这显然是错误的。我知道1
name v2 f1
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随附的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, ]
dtapply
将对第二个参数的每个唯一值应用该函数,因此您不应该使用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, ]
d请提供您的数据集的一小部分摘录和基于它的所需输出,您的问题将成为一个好问题。我猜tapply
在这方面相当混乱,类似于tapply(1:nrow(iris),iris$Species,function(I)I[which.min(iris$Sepal.Length)]
。如果您愿意使用诸如dplyr或data.table之类的软件包,可以使用一些更直观的语法。或者,by()
函数可能会有所帮助:请提供数据集的一小部分摘录以及基于它的所需输出,您的问题将成为一个好问题。我猜tapply
对此相当混乱,类似于tapply(1:nrow(iris),iris$Species,function(I)I[which.min(iris$Sepal.Length)]
。如果您愿意使用诸如dplyr或data.table之类的软件包,可以使用一些更直观的语法。或者,by()
函数可能会有所帮助:它仍然会给出子组中的行号,而不是完整的表。请尝试iris[taply(iris$Sepal.Length,iris$Species,which.min),]
查看问题。感谢您指出这个问题@Frank,我误解了这个问题。我编辑了我的答案。谢谢@sinQueso,我做了类似的事情,这很有帮助。我使用如下方式拆分ds:y这仍然会在子组中给出行号,而不是整个表。请尝试iris[taply(iris$Sepal.Length,iris$Species,which.min),]
查看问题。感谢您指出这个问题@Frank,我误解了这个问题。我编辑了我的答案。谢谢@sinQueso,我做了类似的事情,这很有帮助。我使用如下方式拆分ds:y