Home > Software engineering >  How to create ascending number and letter order columns names
How to create ascending number and letter order columns names

Time:02-04

I have complex header names columns

 [1] "Proszę podać, ile godzin dziennie oglądasz zazwyczaj treści VIDEO wymienione wyżej, BEZ PRZERYWANIA INNĄ AKTYWNOSCIĄ.\r\n"                                             
 [2] "oglądanie treści video, w tym granie w gry video, itp....12"                                                                                                           
 [3] "słuchanie muzyki, audycji radiowych, podcastów, audiobooków, itp....13"                                                                                                
 [4] "edukacja - czytanie lub wykonywanie zadań związanych ze szkołą/studiami, itp. "                                                                                        
 [5] "pisanie e-maili lub wysyłanie postów w social mediach, itp. "                                                                                                          
 [6] "wysyłanie SMS lub korzystanie z komunikatorów internetowych i czatów, itp. "                                                                                           
 [7] "rozmowa przez telefon lub komunikator video, itp. "                                                                                                                    
 [8] "Proszę podać, ile godzin dziennie słuchasz zazwyczaj treści AUDIO wymienione wyżej, BEZ PRZERYWANIA INNĄ AKTYWNOSCIĄ. \r\n"                                            
 [9] "oglądanie treści video, w tym granie w gry video, itp....19"                                                                                                           
[10] "słuchanie muzyki, audycji radiowych, podcastów, audiobooków, itp.2" 

I am stopping here to the tenth, but the naming is reiterated since after columns whose name starts with "Proszę.." there is a subset of columns:

 [2] oglądanie treści video, w tym granie w gry video, itp....12"                                                                                                           
 [3] "słuchanie muzyki, audycji radiowych, podcastów, audiobooków, itp....13"                                                                                                
 [4] "edukacja

What I would like to do, is to create a code that renames the "Proszę" column into a column named "Primary" and then followed by each singular alphabet letter. For example

1) position number 1: this would be converted in "Primary A"
2) position number 2: this would be converted into "PrimaryB"

the other subset I would like they become converted like this:

  1. oglądanie in position 2: as "Second A"
  2. the one in position 9: "Second B"

and so on with the number and letter succession. I have the problem that not always is easy to recognize the unique occurrence of each item, due to complex wording. So it would be better to have a solution that exploits just reiterated elements of each column.

If you want I leave un a small example of dataset here.

dput(head(MMT[,25:34], 1))
structure(list(`Prosze podac, ile godzin dziennie korzystasz zazwyczaj z materialów do CZYTANIA wymienionych wyzej, BEZ PRZERYWANIA INNA AKTYWNOSCIA.
` = "mniej niz 1 godzine", 
    `ogladanie tresci video, w tym granie w gry video, itp.2` = "nigdy", 
    `sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp.3` = "okolo 3- 4 godzin", 
    `czytanie lub wykonywanie zadan zwiazanych ze szkola/studiami, itp.2` = "okolo 1-2 godzin", 
    `pisanie e-maili lub wysylanie postów w social mediach, itp.2` = "mniej niz 1 godzine", 
    `wysylanie SMS lub korzystanie z komunikatorów internetowych i czatów, itp.2` = "okolo 1-2 godzin", 
    `rozmowa przez telefon lub komunikator video, itp.2` = "nigdy", 
    `Prosze podac, ile godzin dziennie  spedzasz zazwyczaj na czytaniu i pisaniu MAILE I POSTY na social mediach wymienionych wyzej, BEZ PRZERYWANIA INNA AKTYWNOSCIA. 
` = "mniej niz 1 godzine", 
    `ogladanie tresci video, w tym granie w gry video, itp.3` = "nigdy", 
    `sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp....34` = "okolo 2-3 godzin"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))                                          

CodePudding user response:

Saving the data frame as dat, try the following. You can be as general or specific as you like with grep()--below is just an example.

> i <- grep('^[Pp]ros', names(dat))
> i
[1] 1 8
> 
> names(dat)[i] <- paste('Primary', letters[1:length(i)])
> names(dat)
 [1] "Primary a"                                                                  
 [2] "ogladanie tresci video, w tym granie w gry video, itp.2"                    
 [3] "sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp.3"         
 [4] "czytanie lub wykonywanie zadan zwiazanych ze szkola/studiami, itp.2"        
 [5] "pisanie e-maili lub wysylanie postów w social mediach, itp.2"               
 [6] "wysylanie SMS lub korzystanie z komunikatorów internetowych i czatów, itp.2"
 [7] "rozmowa przez telefon lub komunikator video, itp.2"                         
 [8] "Primary b"                                                                  
 [9] "ogladanie tresci video, w tym granie w gry video, itp.3"                    
[10] "sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp....34" 

If you have many pairs (old -> new) you could do something like this:

oldnames <- c('something', 'else', 'nothing')
newnames <- c('new1', 'new2', 'new3')

for (i in 1:length(oldnames)) {
  j <- grep(oldnames[i], names(dat))
  names(dat)[j] <- paste(newnames[i], letters[1:length(j)])
}

There are many possible variations on this approach.

  • Related