如何在R中根据另一个 Dataframe 更改列名?

pdkcd3nj  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(132)
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

怎么做?

aydmsdu9

aydmsdu91#

我们可以只删除子串rename_at

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

或者如果需要从'df 2'

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

更新

如果“df 1”中的所有列名都不在“df 2”的key/瓦尔列中,则选项为

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)
xe55xuns

xe55xuns2#

这是我在研究同一问题时最受欢迎的线程之一。最近的dplyr版本已经使这变得更容易,如果你使用一个命名的向量,并利用any_of函数,这使得它非常宽容,当你有列名可能在df2中,但不存在于df1。使用您的案例,您可以:

lookup <- setNames(as.character(df2$name), df2$altname)
df1 %>% 
  rename(any_of(lookup)) %>% 
  table %>% 
  data.frame(.)

或者作为嵌入式一行程序:

df1 %>% 
  rename(any_of(setNames(as.character(df2$name), df2$altname))) %>% 
  table %>% 
  data.frame(.)

参考:https://dplyr.tidyverse.org/reference/rename.html

相关问题