代码之家  ›  专栏  ›  技术社区  ›  Jaccar

在R中重命名多列的简化方法

  •  0
  • Jaccar  · 技术社区  · 7 年前

    我合并了两组数据——假设一组与新妈妈有关,另一组与婴儿有关。在他们最初的数据帧中,他们没有在列中指定他们是母亲还是婴儿,但是现在他们被合并了,对于一些列,为了避免混淆,值得指定。我不一定要对所有列都这样做,因为在某些情况下,这是显而易见的,并且会使列名太长和笨拙,而在另一些情况下,它们两者都相关。

    例如,我有这样的东西,除了更多的列:

    family <- c("Ali", "Baker", "Cruz")
    sex <- c("FEMALE", "MALE", "FEMALE")
    first_name <- c("Aylin", "Betty", "Camila")
    age <- c(30, 27, 36)
    area <- c("Aberdeen", "Birmingham", "Cardiff")
    
    
    births_df <- data.frame(family, sex, first_name, age, area)
    

    在本例中,第一列和最后一列与双方相关,第二列与婴儿相关,其余列与母亲相关。

    我想重命名第3列和第4列,使它们在现有列名之前显示“mother”。

    很明显,我可以单独这样做,如下所示,但是如果我必须对很多列重复这样做,这是不可行的。

    births_df <- rename(births_df, c("first_name" = "mother_first_name", 
                                     "age" = "mother_age"
                                     ))
    

    我试着写一个函数来实现这一点:

    rename_cols_mother <- function(data_f, column_name) {
      plyr::rename(data_f, c(column_name = paste("staff_", column_name)))
        }
    

    births_df <- rename_cols_mother(births_df, c("first_name", "age"))
    

    以下 from 中不存在值 x

    当然,有一种方法可以做到这一点,而不需要函数!

    1 回复  |  直到 7 年前
        1
  •  2
  •   moodymudskipper    7 年前

    具有 dplyr :

    library(dplyr)
    births_df %>% rename_at(3:4,~paste0("mother_", .))
    #   family    sex mother_first_name mother_age       area
    # 1    Ali FEMALE             Aylin         30   Aberdeen
    # 2  Baker   MALE             Betty         27 Birmingham
    # 3   Cruz FEMALE            Camila         36    Cardiff
    

    同时工作:

    births_df %>% rename_at(c("first_name", "age"),~paste0("mother_", .))
    births_df %>% rename_at(vars(first_name, age),~paste0("mother_", .))
    
        2
  •  0
  •   Tho Vu    6 年前

    另一种方法是 rename_at() , vars() 和 matches()

    library(dplyr)
    births_df <- births_df %>% 
      rename_at(vars(matches("first_name|age")), ~ str_replace(., "^", "mother_"))
    #   family    sex mother_first_name mother_age       area
    # 1    Ali FEMALE             Aylin         30   Aberdeen
    # 2  Baker   MALE             Betty         27 Birmingham
    # 3   Cruz FEMALE            Camila         36    Cardiff
    

    first_name 或 age ,然后使用 str_replace() mother_ . 这种方法在这种情况下有效。