Tom
Tom

Reputation: 2351

Changing multiple column names with a vector

I have tried to change column names based on a vector as follows:

library(data.table)
df <- fread(
"radio1 radio2 radio3 radio4 radio5 radio6 radio7
8   12  18  32  40  36  32
6   12  18  24  30  36  30
8   16  18  24  30  36  18
4   12  12  24  30  36  24
6   16  24  32  40  48  24
8   12  18  24  30  36  30
8   12  18  24  30  36  18
8   16  24  32  40  48  40
8   16  24  24  30  48  48",
  header = TRUE
)

var <- c("radio1","radio2","radio3","radio4","radio5", "radio6", "radio7")
recode <- c("A","B","C","D","E", "F", "G")
variables <- cbind(var, recode)
variables <- as.data.table(variables)

for (i in seq_len(ncol(df))) { 
colnames(df[[i]]) <-  variables$recode[match(names(df)[i], variables $var)]
}

I however get the error:

Error in `colnames<-`(`*tmp*`, value = variables$recode[match(names(df)[i],  : 
  attempt to set 'colnames' on an object with less than two dimensions

What am I doing wrong? Is there a better way to do this?

Upvotes: 0

Views: 42

Answers (2)

Ronak Shah
Ronak Shah

Reputation: 389235

You can use match directly.

names(df) <- variables$recode[match(names(df), variables$var)]
df
#   A  B  C  D  E  F  G
#1: 8 12 18 32 40 36 32
#2: 6 12 18 24 30 36 30
#3: 8 16 18 24 30 36 18
#4: 4 12 12 24 30 36 24
#5: 6 16 24 32 40 48 24
#6: 8 12 18 24 30 36 30
#7: 8 12 18 24 30 36 18
#8: 8 16 24 32 40 48 40
#9: 8 16 24 24 30 48 48

Upvotes: 3

heck1
heck1

Reputation: 726

By changing colnames(df[[i]]) to colnames(df)[i], the loop works fine:

  for (i in seq_len(ncol(df))) { 
      colnames(df)[i] <-  variables$recode[match(names(df)[i], variables$var)] }

> df
   A  B  C  D  E  F  G
1: 8 12 18 32 40 36 32
2: 6 12 18 24 30 36 30
3: 8 16 18 24 30 36 18
4: 4 12 12 24 30 36 24
5: 6 16 24 32 40 48 24
6: 8 12 18 24 30 36 30
7: 8 12 18 24 30 36 18
8: 8 16 24 32 40 48 40
9: 8 16 24 24 30 48 48

Upvotes: 2

Related Questions