0

I have a data frame where I would like to put in front of a column name the following words: "high_" and "low_". The name of the columns from X2-X4 should be renamed eg.high_X2 and X5-X7 eg. low_X6.

Please see an example below.

  X1 X2 X3 X4 X5 X6 X7
a 1  0  1  1  1  1  0
b 2  2  1  1  1  1  0

result

  X1 high_X2 high_X3 high_X4 low_X5 low_X6 low_X7
a 1  0  1  1  1  1  0
b 2  2  1  1  1  1  0

2 Answers 2

1

You can use rep and paste -

names(df)[-1] <- paste(rep(c('high', 'low'), each = 3), names(df)[-1], sep = '_')
df

#  X1 high_X2 high_X3 high_X4 low_X5 low_X6 low_X7
#a  1       0       1       1      1      1      0
#b  2       2       1       1      1      1      0

If you want to rely on range of columns then dplyr code would be easier.

library(dplyr)
df %>%
  rename_with(~paste('high', ., sep = '_'), X2:X4) %>%
  rename_with(~paste('low', ., sep = '_'), X5:X7)
Sign up to request clarification or add additional context in comments.

2 Comments

Looks like a good solution but I have only shown here a fragment of my data frame and the problem is more complex. Would be great if the function includes sth like eg. from X2 to X4 instead of each =3
Maybe the updated answer using rename_with is closer to what you are looking for?
1

The base solution (which is more straitforward for these kind of things imo)

df <- data.frame(X1=c(a=1L,b=2L),
                 X2=c(a=0L,b=2L),
                 X3=c(a=1L,b=1L),
                 X4=c(a=1L,b=1L),
                 X5=c(a=1L,b=1L),
                 X6=c(a=1L,b=1L),
                 X7=c(a=1L,b=1L))
cn <- colnames(df)
cond <- as.integer(substr(cn,2L,nchar(cn))) %% 2L == 0L
colnames(df)[cond] <- paste0(cn[cond],"_is_pair")

A tidyverse solution (a bit more awkward due to the tidyeval)

library(dplyr)
library(stringr)
library(tidyselect)
df <- data.frame(X1=c(a=1L,b=2L),
                 X2=c(a=0L,b=2L),
                 X3=c(a=1L,b=1L),
                 X4=c(a=1L,b=1L),
                 X5=c(a=1L,b=1L),
                 X6=c(a=1L,b=1L),
                 X7=c(a=1L,b=1L))

is_pair <- function(vars = peek_vars(fn = "is_pair")) {
  vars[as.integer(str_sub(vars,2L,nchar(vars))) %% 2L == 0L]
}
df %>% rename_with(~paste0(.x,"_is_pair"),
                   is_pair())

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.