Renaming string text in a column

Asked

Viewed 74 times

3

Hello, good morning!

I have a quarterly data frame that is divided by 1st, 2nd and 3rd month of each quarter, see:

         Trimestre         Variável   Referência temporal
 1º trimestre 2007 Animais abatidos    No 1º mês                   
 1º trimestre 2007 Animais abatidos    No 1º mês                      
 1º trimestre 2007 Animais abatidos    No 1º mês                      
 1º trimestre 2007 Animais abatidos    No 1º mês                      
 1º trimestre 2007 Animais abatidos    No 1º mês                      
 1º trimestre 2007 Animais abatidos    No 1º mês 
 1º trimestre 2007 Animais abatidos    No 2º mês
 1º trimestre 2007 Animais abatidos    No 2º mês
 2º trimestre 2007 Animais abatidos    No 1º mês  
 2º trimestre 2007 Animais abatidos    No 1º mês 
 2º trimestre 2007 Animais abatidos    No 1º mês 
 2º trimestre 2007 Animais abatidos    No 1º mês
 2º trimestre 2007 Animais abatidos    No 2º mês  
 2º trimestre 2007 Animais abatidos    No 2º mês

I want to rename in the Time reference column for months of the year according to the quarter, so I want my frame date to look like this:

          Trimestre         Variável   Referência temporal
 1º trimestre 2007 Animais abatidos    Janeiro                   
 1º trimestre 2007 Animais abatidos    Janeiro                     
 1º trimestre 2007 Animais abatidos    Janeiro                      
 1º trimestre 2007 Animais abatidos    Janeiro                       
 1º trimestre 2007 Animais abatidos    Janeiro                        
 1º trimestre 2007 Animais abatidos    Janeiro   
 1º trimestre 2007 Animais abatidos    Fevereiro  
 1º trimestre 2007 Animais abatidos    Fevereiro
 2º trimestre 2007 Animais abatidos    Abril
 2º trimestre 2007 Animais abatidos    Abril
 2º trimestre 2007 Animais abatidos    Abril
 2º trimestre 2007 Animais abatidos    Abril  
 2º trimestre 2007 Animais abatidos    Maio  
 2º trimestre 2007 Animais abatidos    Maio   

Note that the 1st month of the 1st quarter is January, 2nd month of the 1st quarter is February, and so on...

Is there any way to rename these strings directly? Because, my data frame is quite large and it would be impossible to rename line by line.

Result of dput(head(table 1092):

> dput(head(tabela1092))
structure(list(Trimestre = c("1º trimestre 2007", "1º trimestre 2007", 
"1º trimestre 2007", "1º trimestre 2007", "1º trimestre 2007", 
"1º trimestre 2007"), Variável = c("Animais abatidos", "Animais abatidos", 
"Animais abatidos", "Animais abatidos", "Animais abatidos", "Animais abatidos"
), `Referência temporal (Código)` = c("115233", "115233", "115233", 
"115233", "115233", "115233"), `Referência temporal` = c("No 1º mês", 
"No 1º mês", "No 1º mês", "No 1º mês", "No 1º mês", "No 1º mês"
), `Tipo de rebanho bovino` = c("Bois", "Bois", "Bois", "Bois", 
"Bois", "Bois"), `Tipo de inspeção` = c("Total", "Total", "Total", 
"Total", "Total", "Total"), `Unidade da Federação` = c("Rondônia", 
"Acre", "Amazonas", "Roraima", "Pará", "Amapá"), `Unidade de Medida` = c("Cabeças", 
"Cabeças", "Cabeças", "Cabeças", "Cabeças", "Cabeças"), Valor = c(83979, 
17709, 5982, NA, 111030, NA)), row.names = 2:7, class = "data.frame")
  • 1

    Do you want to rename the Time Reference column by the quarter column? Please put the result of dput(head(data)) in the question, so it is easier to elaborate the answer

2 answers

2

One of the ways you do this is by using the function ifelse together with the logical operator & and with the subset of strings from substr (so that it is not dependent on the year):

dados$referencia.temporal <- ifelse(substr(dados$Trimestre,1,1)=="1" & substr(dados$`Referência temporal`,4,4)=="1", "Janeiro",
                                    ifelse(substr(dados$Trimestre,1,1)=="1" & substr(dados$`Referência temporal`,4,4)=="2", "Fevereiro",
                                           ifelse(substr(dados$Trimestre,1,1)=="1" & substr(dados$`Referência temporal`,4,4)=='3', "Março",
                                                  ifelse(substr(dados$Trimestre,1,1)=="2" & substr(dados$`Referência temporal`,4,4)=="1", "Abril",
                                                         ifelse(substr(dados$Trimestre,1,1)=="2" & substr(dados$`Referência temporal`,4,4)=="2", "Maio",
                                                                ifelse(substr(dados$Trimestre,1,1)=="2" & substr(dados$`Referência temporal`,4,4)=='3', "Junho",
                                                                       ifelse(substr(dados$Trimestre,1,1)=="3" & substr(dados$`Referência temporal`,4,4)=="1", "Julho",
                                                                              ifelse(substr(dados$Trimestre,1,1)=="3" & substr(dados$`Referência temporal`,4,4)=="2", "Agosto",
                                                                                     ifelse(substr(dados$Trimestre,1,1)=="3" & substr(dados$`Referência temporal`,4,4)=='3', "Setembro",
                                                                                            ifelse(substr(dados$Trimestre,1,1)=="4" & substr(dados$`Referência temporal`,4,4)=="1", "Outubro",
                                                                                                   ifelse(substr(dados$Trimestre,1,1)=="4" & substr(dados$`Referência temporal`,4,4)=="2", "Novembro",
                                                                                                          ifelse(substr(dados$Trimestre,1,1)=="4" & substr(dados$`Referência temporal`,4,4)=='3', "Dezembro","Erro"))))))))))))

With this, I can combine the value of the two columns. Another way to do this would be through a left join from the function merge for example.

0

I believe the code below does what you ask.
Note that the data from dput do not have the same structure as the tables of the question. I will use the data of the dput and create a table as the expected result of the question, with only 3 columns.

trm <- gsub("(^[[:digit:]]+).*", "\\1", tabela1092[[1]])
trm <- as.numeric(trm)

mes <- gsub("[^[:digit:]]+", "", tabela1092[[4]])
mes <- as.numeric(mes)

nomes.meses <- c("Janeiro", "Fevereiro", "Março",
                 "Abril", "Maio", "Junho",
                 "Julho", "Agosto", "Setembro",
                 "Outubro", "Novembro", "Dezembro")

result <- tabela1092[c(1, 2, 4)]
result[[3]] <- nomes.meses[mes + 3*(trm - 1)]

result
#          Trimestre         Variável Referência temporal
#2 1º trimestre 2007 Animais abatidos             Janeiro
#3 1º trimestre 2007 Animais abatidos             Janeiro
#4 1º trimestre 2007 Animais abatidos             Janeiro
#5 1º trimestre 2007 Animais abatidos             Janeiro
#6 1º trimestre 2007 Animais abatidos             Janeiro
#7 1º trimestre 2007 Animais abatidos             Janeiro
  • cool! In terms of computational efficiency, yours is better?

  • @I don’t know, the gsub is slow but indexing is fast. And the ifelse is also slow. As has more ifelse that gsub, maybe mine is more efficient but only testing.

  • Thanks guys!!! The two solutions worked super well.

Browser other questions tagged

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