Find higher row value and return the column title of a data frame

Asked

Viewed 27 times

0

i have a wide format data frame with 5 variables (Município, Agropecuária, Indústria, Serviços Públicos and Serviços Privados). I would like to create a sixth variable called Predominante with the name of the column, that is, the name of the sector with the highest value of the respective row.

Example for line 1: Save the text "Farming" in variable Predominante (since it is the sector with the highest value) and so on.

The head of Tibble is just below for viewing.

# A tibble: 6 x 6
  Município                  Agropecuária Indústria `Serviços Públicos` `Serviços Privados` Predominante
  <chr>                             <dbl>     <dbl>               <dbl>               <dbl> <chr>       
1 Alta Floresta D'Oeste - RO       165892     26369              155271              123512           
2 Ariquemes - RO                   163121    339667              674541             1034184           
3 Cabixi - RO                       62337      5179               42164               25171           
4 Cacoal - RO                      212493    222558              548595              971609           
5 Cerejeiras - RO                   61973     22818              109796              208728           
6 Colorado do Oeste - RO            73479     26195              105915              103454 

Does anyone have any hint as to how I can resolve this issue?

If you want to reproduce the code, follow below:

## Pacotes Utilizados --------------------------------------------------------------------------------

library(sidrar)
library(magrittr)
library(tidyr)
library(tidyverse)
library(geobr)

## Base de Dados -------------------------------------------------------------------------------------

PIB.Municipios <- get_sidra(api = '/t/5938/n6/all/v/513,517,525,6575/p/last%201/d/v513%200,v517%200,v525%200,v6575%200') %>% 
  select(Município, Variável, Valor) %>% 
  pivot_wider(names_from = Variável, values_from = Valor) %>% 
  rename(Agropecuária = `Valor adicionado bruto a preços correntes da agropecuária`) %>% 
  rename(Indústria = `Valor adicionado bruto a preços correntes da indústria`) %>% 
  rename(`Serviços Públicos` = `Valor adicionado bruto a preços correntes da administração, defesa, educação e saúde públicas e seguridade social`) %>% 
  rename(`Serviços Privados` = `Valor adicionado bruto a preços correntes dos serviços, exclusive administração, defesa, educação e saúde públicas e seguridade social`) %>% 
  mutate(Predominante = '')

Thank you very much!

1 answer

1

This solution is in R base. First a cycle apply determines the number of the numeric column with the highest value in each row. Then create the new column with the column names corresponding to those numbers.

i <- apply(dados[-1], 1, which.max)
dados$Predominante <- names(dados)[-1][i]

dados
#                   Município Agropecuária Indústria Serviços.Públicos Serviços.Privados      Predominante
#1 Alta Floresta D'Oeste - RO       165892     26369            155271            123512      Agropecuária
#2             Ariquemes - RO       163121    339667            674541           1034184 Serviços.Privados
#3                Cabixi - RO        62337      5179             42164             25171      Agropecuária
#4                Cacoal - RO       212493    222558            548595            971609 Serviços.Privados
#5            Cerejeiras - RO        61973     22818            109796            208728 Serviços.Privados
#6     Colorado do Oeste - RO        73479     26195            105915            103454 Serviços.Públicos

Browser other questions tagged

You are not signed in. Login or sign up in order to post.