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

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

我的数据集名为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]
    
    但这显然是错误的。我知道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, ]
    

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

    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