найти индекс максимального значения в R

r dataframe

17862 просмотра

4 ответа

355 Репутация автора

У меня есть следующий фрейм данных называется 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.

Автор: kimmyjo221 Источник Размещён: 03.10.2012 11:17

Ответы (4)


6 плюса

145967 Репутация автора

Вот решение 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
Автор: Joshua Ulrich Размещён: 03.10.2012 11:23

7 плюса

54478 Репутация автора

Решение

Если у вас есть максимум 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
Автор: James Размещён: 03.10.2012 01:08

13 плюса

96830 Репутация автора

И data.tableрешение для кодирования элегантности

library(data.table)
surge <- as.data.table(surge)
surge[, .SD[which.max(surge)], by = StormID]
Автор: mnel Размещён: 04.10.2012 03:31

13 плюса

150 Репутация автора

вот еще одно решение для data.table, но не опирающееся на .SD (таким образом, в 10 раз быстрее)

surge[,grp.ranks:=rank(-1*surge,ties.method='min'),by=StormID]
surge[grp.ranks==1,]
Автор: massyah Размещён: 18.10.2012 12:48
Вопросы из категории :
32x32