【问题标题】:How to find the position of the maximum value in a list in R?如何在R中的列表中找到最大值的位置?
【发布时间】:2021-12-19 06:44:16
【问题描述】:

这个好像应该很简单,但是网上想不通,也找不到解决办法。

我有一个清单

test<-list(a = list(c(4543, 25234, 56346, 676), c(545, 34647, 567567, 
4564), c(785, 343, 95, 435)), b = list(c(90823, 2341, 989, 5645
), c(210938, 342345, 345, 78678), c(2094234, 2343, 23466, 45654
)))

如何找到最大值在列表中的位置?

答案是test[["b"]][[3]][1]test[[2]][[3]][1]

【问题讨论】:

  • 看看lapply(test, lapply, which.max) 的输出,让我知道它与您想要的结果相比如何
  • max(unlist(test)) 为您提供最大值,与test[["b"]][[3]][1]test[[2]][[3]][1] 相同。但是您的问题标题提到了“最大值位置”,它没有显示在您提供的示例输出中(test[["b"]][[3]][1]test[[2]][[3]][1])。我很困惑。

标签: r list


【解决方案1】:

有点乱,但它会给你最大价值的位置

library(stringr)
library(dplyr)

x <- which.max(unlist(test))
y <- str_split(names(x), "", simplify = T)
a <- y[1]


z <- sapply(test[[a]], length) %>% cumsum
b <- which(z > as.numeric(y[2]))
c <- as.numeric(y[2]) - z[b-1]

test[[a]][[b]][[c]]

[1] 2094234

在此代码中,abc 表示位置。如果您需要更通用的版本,请告诉我

【讨论】:

  • 谢谢,这很有帮助。你的代码让我觉得一个更简单的方法是先简单地命名列表中的每个元素,然后当我做 names(which.max(unlist(test))) 时,位置由名称给出。
  • @Eric 如果列表有每个名字,那么它会容易得多,正如你所说的。它可以在我的代码的第一行结束:)。
【解决方案2】:

你可以试试下面的代码

df <- do.call(
  rbind,
  Map(
    function(x, y) {
      transform(
        stack(setNames(x, seq_along(x))),
        lb = ave(seq_along(ind), ind, FUN = seq_along),
        lt = y
      )
    },
    test,
    names(test)
  )
)

df[order(-df$values), c("values", "lt", "ind", "lb")]

给了

      values lt ind lb
b.9  2094234  b   3  1
a.7   567567  a   2  3
b.6   342345  b   2  2
b.5   210938  b   2  1
b.1    90823  b   1  1
b.8    78678  b   2  4
a.3    56346  a   1  3
b.12   45654  b   3  4
a.6    34647  a   2  2
a.2    25234  a   1  2
b.11   23466  b   3  3
b.4     5645  b   1  4
a.8     4564  a   2  4
a.1     4543  a   1  1
b.10    2343  b   3  2
b.2     2341  b   1  2
b.3      989  b   1  3
a.9      785  a   3  1
a.4      676  a   1  4
a.5      545  a   2  1
a.12     435  a   3  4
b.7      345  b   2  3
a.10     343  a   3  2
a.11      95  a   3  3

您将获得嵌套列表中具有关联索引的值的顺序。

【讨论】:

  • 太棒了!我不知道这种方法是可能的。
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 2021-09-18
  • 2019-07-05
  • 2014-08-04
  • 2021-11-06
  • 1970-01-01
  • 2022-07-19
相关资源
最近更新 更多