找到R中最大值的索引

kim*_*221 19 r dataframe

我有以下数据框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
Run Code Online (Sandbox Code Playgroud)

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

MaxSurge <- data.frame(tapply(surge[,4], surge[,2], max))
Run Code Online (Sandbox Code Playgroud)

它返回:

1412 0.12
1413 0.06
Run Code Online (Sandbox Code Playgroud)

这很好,除了我还希望它包含MeshID在浪涌最大的点处的值.我知道我可能会使用which.max,但我无法弄清楚如何将其付诸行动.我对R编程非常陌生.

mne*_*nel 13

data.table编码优雅的解决方案

library(data.table)
surge <- as.data.table(surge)
surge[, .SD[which.max(surge)], by = StormID]
Run Code Online (Sandbox Code Playgroud)


小智 13

这是另一个data.table解决方案,但不依赖于.SD(因此速度提高了10倍)

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

  • `.I`现在在v1.8.3中. (3认同)
  • +1非常好!当添加`.I`时,它会更容易(我希望更快):`浪涌[喘振[,我[[max(浪涌)],by = StormID,drop = TRUE]]`.这有点难看,所以我们可以自动优化`.SD`方法来做到这一点,以保持mnel的答案的优雅.所以请注意,这是正确的,因为你正确地说,如果可能的话,应该避免使用`.SD`,因为它创建了可能不需要的整个子集.但希望将来不会这样.其中一个原因是`[...]`所以`data.table`可以在将来优化这样的事情. (2认同)

Jam*_*mes 7

如果最多有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
Run Code Online (Sandbox Code Playgroud)


Jos*_*ich 6

这是一个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
Run Code Online (Sandbox Code Playgroud)