Encontrar o número da coluna e valorizar o segundo maior valor em uma linha

Eu estou tentando escrever algum código que identifica os dois maiores valores para cada linha e fornece seu número de coluna e valor.

<code>df = data.frame( car = c (2,1,1,1,0), bus = c (0,2,0,1,0),
                 walk = c (0,3,2,0,0), bike = c(0,4,0,0,1))
</code>

Eu consegui fazer isso para o valor máximo usando omax emax.col funções.

<code>df$max = max.col(df,ties.method="first")
df$val = apply(df[ ,1:4], 1, max)
</code>

Tanto quanto eu sei, não há funções equivalentes para o segundo maior valor, então isso tornou as coisas um pouco mais complicadas. Usando este código fornece o segundo maior valor, mas (importante) não em situações com empates. Também parece arriscado.

<code>sec.fun <- function (x) {
  max( x[x!=max(x)] )
}

df$val2 <- apply(df[ ,1:4], 1, sec.fun)
</code>

Idealmente, a solução não envolveria a remoção de nenhum dado original e poderia ser usada para encontrar o terceiro, quarto ... maior valor, mas nenhum deles é um requisito essencial.

questionAnswers(1)

yourAnswerToTheQuestion