【问题标题】:How do I find the i j k indices of the maximum value in a list in r?如何在 r 的列表中找到最大值的 i j k 索引?
【发布时间】:2021-11-06 11:05:31
【问题描述】:

我在 R 中有一个列表,其中有数据 (Data):

#create data
tmintest=array(1:100, c(12,256,512))

#create the list
Variable <- list(varName = c("tmin","tmin","tmin","tmin","tmin","tmin","tmin","tmin","tmin","tmin","tmin","tmin"),level = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
Data     <- tmintest
xyCoords <- list(x = seq(-40.37,64.37,length.out=420), y = seq(25.37,72.37,length.out=189))
Dates <- list(start = seq(as.Date("2012-01-01"), as.Date("2015-12-31"), by="days"), end=seq(as.Date("2012-01-01"), as.Date("2015-12-31"), by="days"))
All <- list(Variable = Variable,Data=Data, xyCoords=xyCoords,Dates=Dates)

我怎样才能准确地找到ALL$Data 中最大数字的位置?例如,如果它是第一个“切片”或“网格”的第 4 行第 100 列,我想返回:[1,4,100]。

我试过 which.max(All$Data) 但只返回一个数字?

【问题讨论】:

    标签: r list indices


    【解决方案1】:

    which 支持arr.ind,它返回条件的数组索引。不幸的是,which.max 没有这样的参数,因此我们可以将值与值的最大值进行比较。

    head( which(All$Data == max(All$Data), arr.ind = TRUE) )
    #      dim1 dim2 dim3
    # [1,]    4    9    1
    # [2,]    8   17    1
    # [3,]   12   25    1
    # [4,]    4   34    1
    # [5,]    8   42    1
    # [6,]   12   50    1
    

    在这里我会有点谨慎:当精度涉及大量小数时,浮点数的严格相等测试可能会成为问题。请参阅 Why are these numbers not equal?、Is floating point math broken? 和 https://en.wikipedia.org/wiki/IEEE_754 以获得对此的良好讨论。

    更好的测试是严格的不等式之一,寻找一个容忍度。在这里我将使用1e-5,因为我们知道它明显小于数字范围(1 到 100),但是如果您的实数具有更高的精度,您可能需要更适合您需要的东西。

    head( which( (max(All$Data) - All$Data) < 1e-5, arr.ind = TRUE) )
    #      dim1 dim2 dim3
    # [1,]    4    9    1
    # [2,]    8   17    1
    # [3,]   12   25    1
    # [4,]    4   34    1
    # [5,]    8   42    1
    # [6,]   12   50    1
    

    请注意,如果您将公差值 1e-5过低,您可能会开始丢失值。它不会在这里发生(因为您的数据要大得多)。

    【讨论】:

    • 这是一个猜测,但我认为which.max 不包括数组索引的原因是max 值索引存在一些歧义。 which.max 仅返回第一个索引,但在多个维度中,该索引取决于数组的方向(我们首先查看的是哪个轴顺序,然后是第二个,然后是第三个等等)。你可能会为你的上限选择sqrt(.Machine$double.eps),这在许多其他应用程序中很常用。
    • 这是对上限的一个很好的估计,谢谢。
    • 谢谢。假设 x&lt;-head( which( (max(All$Data) - All$Data) &lt; 1e-5, arr.ind = TRUE) ) ,是否可以使用这些索引 (x) 来索引另一个具有相同结构/大小的列表中的值?即首先确定列表的数据低于某个值的位置,然后使用这些索引来识别另一个数组中的数据,您想将其用作原始索引列表的替换?
    • 这当然是可能的,尽管我总是犹豫是否建议将它们用作这样的原始索引:如果行顺序被更改或由于某种原因无法保证,那么索引仍然可以工作,但会是错的。如果两个框架的行绑定在一起,那么(a)从一开始就将它们组合到同一个框架中,或者(b)如果它们具有可用于连接它们的唯一“键”,则考虑 merge/join 操作.
    • 谢谢。我之前没用过merge/join,但我会看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2013-08-19
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    相关资源
    最近更新 更多