【问题标题】:finding the index of a max value in R在R中找到最大值的索引
【发布时间】:2012-10-03 11:17:53
【问题描述】:

我有以下名为surge 的数据框:

MeshID    StormID Rate Surge Wind
1         1412 1.0000E-01   0.01 0.0
2         1412 1.0000E-01   0.03 0.0
3         1412 1.0000E-01   0.09 0.0
4         1412 1.0000E-01   0.12 0.0
5         1412 1.0000E-01   0.02 0.0
6         1412 1.0000E-01   0.02 0.0
7         1412 1.0000E-01   0.07 0.0
1         1413 1.0000E-01   0.06 0.0
2         1413 1.0000E-01   0.02 0.0
3         1413 1.0000E-01   0.05 0.0

我使用以下代码来查找每次风暴的最大浪涌值:

MaxSurge <- data.frame(tapply(surge[,4], surge[,2], max))

返回:

1412 0.12
1413 0.06

这很好,除了我还希望它在浪涌最大值处包含MeshID 值。我知道我可能可以使用which.max,但我不太清楚如何将其付诸实践。我对 R 编程非常陌生。

【问题讨论】:

  • +1 提出一个恰当的问题。它拥有一切,1)数据,2)你尝试了什么,3)它如何不能完全满足你的需求。
  • MaxSurge[which.max(MaxSurge[,4]),1] 是廉价而肮脏的方式。

标签: r dataframe


【解决方案1】:

还有一个data.table 编码优雅的解决方案

library(data.table)
surge <- as.data.table(surge)
surge[, .SD[which.max(surge)], by = StormID]

【讨论】:

    【解决方案2】:

    这是另一种 data.table 解决方案,但不依赖 .SD(因此速度快 10 倍)

    surge[,grp.ranks:=rank(-1*surge,ties.method='min'),by=StormID]
    surge[grp.ranks==1,]
    

    【讨论】:

    • +1 非常好!当添加.I 时,它会更容易(我希望甚至更快):surge[ surge[,.I[which.max(surge)],by=StormID,drop=TRUE]]。虽然这有点难看,所以我们可以自动优化 .SD 方法来做到这一点,以保持 mnel 答案的优雅。因此,请注意,您正确地说,如果可能的话,目前应该避免.SD,因为它创建了可能不需要的整个子集。但希望这在未来不会是真的。这一切都在[...] 内部的原因之一是data.table 可以在未来优化这样的事情。
    【解决方案3】:

    如果您最多有 2 个 data.points,which.max 将仅引用第一个。更完整的解决方案将涉及rank:

    # data with a tie for max  
    surge <- data.frame(MeshID=c(1:7,1:4),StormID=c(rep(1412,7),
    rep(1413,4)),Surge=c(0.01,0.03,0.09,0.12,0.02,0.02,0.07,0.06,0.02,0.05,0.06))
    
    # compute ranks  
    surge$rank <- ave(-surge$Surge,surge$StormID,FUN=function(x) rank(x,ties.method="min"))
    # subset on the rank  
    subset(surge,rank==1)
       MeshID StormID Surge rank
    4       4    1412  0.12    1
    8       1    1413  0.06    1
    11      4    1413  0.06    1
    

    【讨论】:

    • 这很好用——我担心会出现多个最大值。如果我只关心浪涌 >.10 的情况怎么办?
    • @user1716877 subset(surge,Surge&gt;0.1)
    【解决方案4】:

    这是一个 plyr 解决方案,只是因为如果我不这样做,有人会说...

    R> ddply(surge, "StormID", function(x) x[which.max(x$Surge),])
      MeshID StormID Rate Surge Wind
    1      4    1412  0.1  0.12    0
    2      1    1413  0.1  0.06    0
    

    【讨论】:

    • 这两种方法似乎给出了不同的结果。 ddply 版本有效,因为在函数内部您正在索引x 的子集。在tapply 版本中,which.max 返回子集中最大值的索引,但使用它来索引整个x。
    • 我可以再问一个问题吗?如果我想计算特定stormID的最大重复次数,我该怎么做?在这一点上,它只是选择了 Surge 为最大值的第一个 MeshID 实例,对吗?如果最大值出现不止一次怎么办?谢谢。
    • 完美!对不起,还有一个问题。如果我真的只对浪涌 > .10 的情况感兴趣怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2015-04-18
    • 1970-01-01
    • 2022-07-19
    • 2018-05-05
    相关资源
    最近更新 更多