首页 > 解决方案 > 如何根据 R 中的另一个数据框更改列名?

问题描述

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(例如,更改colbb)更改结果的列名称,预期结果为:

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

怎么做?

标签: r

解决方案


我们可以删除子字符串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' 的 key/val 列中,则选项是

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)

推荐阅读