代码之家  ›  专栏  ›  技术社区  ›  Peter Chen

使用特定单词重命名多个列名

  •  0
  • Peter Chen  · 技术社区  · 6 年前

    我有一个简单的数据如下:

    # 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"
    

    然而,如果我有数百个专栏,我如何才能有效地做到这一点?

    更新:
    col 表示列。如果我的列名不一致,比如 AIR , BUILD LEASE . 我该怎么办?

    3 回复  |  直到 6 年前
        1
  •  4
  •   niko    6 年前

    你可以用 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')
    
        2
  •  3
  •   Rich Scriven    6 年前

    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的回答所示。

        3
  •  1
  •   akrun    6 年前

    我们可以使用 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))