首页 > 解决方案 > 根据 data.frame 重命名 colnames

问题描述

我有几个 data.frames df1, df2, df3, ... 。

df1 <- data.frame(var1 = c("a", "b", "c"),
                  var2 = c("a", "b", "c"),
                  var3 = c("a", "b", "c"),
                  var4 = c("a", "b", "c"))
df2 <- data.frame(var1 = c("a", "b", "c"),
                  var2 = c("a", "b", "c"),
                  var3 = c("a", "b", "c"),
                  var4 = c("a", "b", "c"))
df3 <- data.frame(var1 = c("a", "b", "c"),
                  var2 = c("a", "b", "c"),
                  var3 = c("a", "b", "c"),
                  var4 = c("a", "b", "c"))
df4 <- data.frame(var1 = c("a", "b", "c"),
                  var2 = c("a", "b", "c"),
                  var3 = c("a", "b", "c"),
                  var4 = c("a", "b", "c"))

我有一个 data.frame rename_vars,它告诉 mich 应该重命名哪个 data.frame 中的哪些变量。

rename_vars <- data.frame(df = c("df1", "df1", "df3"), 
var = c("var1", "var3", "var1"), 
rename_to = c("var1x", "var3y", "var1z"))

   df  var rename_to
1 df1 var1     var1x
2 df1 var3     var3y
3 df2 var1     var1z

例如,在df1变量var1应该被重命名为var1x并且var3应该被调用var3x。在 data.frame 中应该调用df2变量等等。var1var1z

但是,我怎样才能自动化这个重命名不同data.frames中的变量的过程rename_vars呢?

感谢帮助!

标签: rtidyverse

解决方案


我们根据 'df' 列拆分 'rename_vars' 数据,然后在( ) 和 'lst1'的值上循环list使用,并使用 更改列名。最好将它保存在 a 中,但如果我们需要更改全局单个对象,请在使用对象名称命名('out')之后使用map2nameslistmgetrename_atlistlist2envlist

library(dplyr)
library(purrr)
lst1 <- split(rename_vars[-1], rename_vars$df)
out <- map2(mget(names(lst1)), lst1, ~ {
       nm1 <- .y[[1]]
       nm2 <- .y[[2]] 
       .x %>% 
         rename_at(vars(nm1), ~ nm2)})
list2env(out, .GlobalEnv)

-输出

df1
#  var1x var2 var3y var4
#1     a    a     a    a
#2     b    b     b    b
#3     c    c     c    c

df3
#  var1z var2 var3 var4
#1     a    a    a    a
#2     b    b    b    b
#3     c    c    c    c

或者另一种选择!!!rename

library(tibble)
lst1 <- split(as.list(deframe(rename_vars[3:2])), rename_vars$df)
list2env(map2(mget(names(lst1)), lst1, ~ .x %>% 
            rename(!!! .y)), .GlobalEnv)

或者使用base R循环forassign

for(i in seq_len(nrow(rename_vars))) {
   tmp1 <- get(rename_vars$df[i])
   i1 <- match(rename_vars$var[i], names(tmp1))
   names(tmp1)[i1] <- rename_vars$rename_to[i]
   assign(rename_vars$df[i], tmp1)
   }

推荐阅读