Переименовать несколько имен столбцов с определенными словами - PullRequest
0 голосов
/ 24 января 2019

У меня есть простые данные, как показано ниже:

# dt
NAME  ID  col3   col4   col5
AAA    1   10     20     15
BBB    3   40     20     30
CCC    6   100   200    150

Я хочу переименовать мои столбцы в:

# dt 
NAME  ID  col3_dt   col4_dt   col5_dt
AAA    1      10        20     15
BBB    3      40        20     30
CCC    6      100      200    150

Переименование col3, col4 и col5 до col3_dt, col4_dt и col5_dt

Я знаю, что я могу менять имена столбцов построчно:

colnames(dt)[3] <- "col3_dt"

Однако, если у меня есть сотни столбцов, как я могу сделать это эффективно?

UPDATE:
Есть несколько хороших ответов, но я просто использую col для представления столбца. Если имена моих столбцов противоречивы, например, AIR, BUILD и LEASE. Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Вы можете сделать

sw <- startsWith(names(dt), "col")
names(dt)[sw] <- paste0(names(dt)[sw], "_dt")
dt
#   NAME ID col3_dt col4_dt col5_dt
# 1  AAA  1      10      20      15
# 2  BBB  3      40      20      30
# 3  CCC  6     100     200     150

Вы также можете сделать однострочное с ifelse().

ifelse(startsWith(names(dt), "col"), paste0(names(dt), "_dt"), names(dt))
# [1] "NAME"    "ID"      "col3_dt" "col4_dt" "col5_dt"

. Для обновленного вопроса вы можете использовать идиому %in%вместо sw, как показано в ответе @ nate.

0 голосов
/ 24 января 2019

Мы можем использовать rename_at

library(tidyverse)
df1 %>% 
   rename_at(vars(matches("col")), ~ paste0(.x, "_dt"))
#  NAME ID col3_dt col4_dt col5_dt
#1  AAA  1      10      20      15
#2  BBB  3      40      20      30
#3  CCC  6     100     200     150

данные

df1 <- structure(list(NAME = c("AAA", "BBB", "CCC"), ID = c(1L, 3L, 
 6L), col3 = c(10L, 40L, 100L), col4 = c(20L, 20L, 200L), col5 = c(15L, 
 30L, 150L)), class = "data.frame", row.names = c(NA, -3L))
0 голосов
/ 24 января 2019

Вы можете использовать regex, например,

ind <- grepl('col\\d+', names(dt))
names(dt)[ind] <- paste0(names(dt)[ind], '_dt')
# or
names(dt) <- sub('^(col\\d+)$', '\\1_dt', names(dt), perl = TRUE)

Редактировать

# Case 1: Exact matches
ind <- names(dt) %in% c('AIR','BUILD','LEASE')
# Case 2: names are of the form 'AIR2', 'BUILD5', etc. 
pat <- paste(paste0(c('AIR','BUILD','LEASE'), '\\d+'), collapse = '|')
ind <- grepl(pat, names(dt), perl = TRUE)  
# Either way then
names(dt)[ind] <- paste0(names(dt)[ind], '_dt')
...