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:
- oglądanie in position 2: as "Second A"
- 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.