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

如何根据R中的另一个数据帧更改列名?

r
  •  3
  • kittygirl  · 技术社区  · 6 年前
    df1 <- data.frame(
        cola = c('1',NA,'c','1','1','e','1',NA,'c','d'),
        colb = c("A",NA,"C","D",'a','b','c','d','c','d'),
        colc = c('a',NA,'c','d','a',NA,'c',NA,'c','d'),stringsAsFactors = TRUE)
    
    df2<-data.frame(name=c('cola','colc','colb'),
                    altname=c('a','c','b'))
    
    df1 %>% table %>% data.frame(.)
    

    上述代码的结果如下:

       cola colb colc Freq
    1     1    a    a    1
    2     c    a    a    0
    

    我要根据更改结果的列名称 df2 (例如,更改 colb b )预期结果为:

          a    b    c Freq
    1     1    a    a    1
    2     c    a    a    0
    

    怎么做?

    1 回复  |  直到 6 年前
        1
  •  3
  •   akrun    6 年前

    我们可以用 rename_at

    library(stringr)
    libraryr(dplyr)
    df1 %>% 
       table %>% 
       data.frame(.) %>%  
       rename_at(1:3, ~ str_remove(., "col"))
    

    或者如果需要来自“df2”

    df1 %>%
       table %>%
       data.frame(.) %>%
       rename_at(1:3, ~ setNames(as.character(df2$altname), df2$name)[.])
    

    更新

    如果“df1”中的所有列名称都不在“df2”的键/值列中,则选项为

    df1 %>%
       table %>%
        data.frame(.) %>%
        rename_at(1:3, ~ coalesce(setNames(as.character(df2$altname), df2$name)[.], .)) 
    

    或者使用R基

    out <- df1 %>% table %>% data.frame(.)
    names(out) <- sub("col", "", names(out))
    

    如果它需要基于第二个数据集

    name(out)[-4] <- df2$altname[match(names(out)[-4], df2$name)]
    

    或与 substr

    names(out) <- substring(names(out), 4)