'Adding a new column next to each existing column that matches a certain column name pattern in R / tidyverse

In a dataframe I want to add a new column next each column whose name matches a certain pattern, for example whose name starts with "ip_" and is followed by a number. The name of the new columns should follow the pattern "newCol_" suffixed by that number again. The values of the new columns should be NA's.

So this dataframe:

enter image description here

should be transformed to that dataframe:

enter image description here

A tidiverse solution with use of regex is much appreciated!

Sample data:

df <- data.frame(
  ID = c("1", "2"),
  ip_1 = c(2,3),
  ip_9 = c(5,7),
  ip_39 = c(11,13),
  in_1 = c("B", "D"),
  in_2 = c("A", "H"),
  in_3 = c("D", "A")
)


Solution 1:[1]

To add the new NA columns :

df[, sub("^ip", "newCol", grep("^ip", names(df), value = TRUE))] <- NA

To reorder them :

df <- df[, order(c(grep("newCol", names(df), invert = TRUE), grep("^ip", names(df))))]

edit :

If it's something you (or whoever stumble here) plan on doing often, you can use this function :

insertCol <- function(x, ind, col.names = ncol(df) + seq_along(colIndex), data = NA){
  out <- x
  out[, col.names] <- data
  out[, order(c(col(x)[1,], ind))]
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1