Abaixo está um exemplo reproduzível com um dataframe de teste:
ts<-structure(list(OP = c(1, 3, 5), x = c(0.405595375690609, 0.256223899079487,
0.0131878938991576), y = c(0.792096293298528, 0.0120686823502183,
0.518370501697063), z = c(0.400826650671661, 0.279657100560144,
0.409006189322099)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-3L))
Quero adicionar uma coluna usando mutate
que me dê para cada linha a posição da coluna do segundo maior valor dentro das colunas selecionadas. Até agora, só consegui obter a coluna de índice do valor máximo dentro das colunas selecionadas fazendo:
td<-ts %>%
rowwise() %>%
mutate(second_max = which.max(c_across(c(2:4))))
Entretanto, para esse dataframe específico, minha saída desejada seria:
OP | x | e | por | segundo_máximo |
---|---|---|---|---|
1 | 0,4055954 | 0,7920963 | 0,4008267 | 1 |
3 | 0,2562239 | 0,0120687 | 0,2796571 | 1 |
5 | 0,0131879 | 0,5183705 | 0,4090062 | 3 |
Uma possibilidade poderia ser:
A mesma ideia com a adição de
purrr
:Você pode usar
tapply
+row
+rank
como abaixoo que dá
Referência (se estiver interessado)
mostra
Existem maneiras mais concisas e eficientes de fazer isso, mas uma maneira "legível" do tidyverse seria unir
ts
ao resultado de <pivotarts
long, organizar por ordem decrescentevalue
e manter o segundo valor dentro de cadaOP
>.Resultado
Nós temos
{Rfast}
Você também pode usar
max.col
duas vezes