根据循环中df的名称更改多个df中的列

时间:2020-03-04 13:53:37

标签: r for-loop dplyr

我想在一个循环中更改几个df中的列名,其中新的列名取决于df的名称:

library(dplyr)

# A simple example of my data:
dataframe_AA <- data.frame(
  var1 = sample(1:3),
  var2 = sample(1:3),
  var3 = sample(1:3))

dataframe_AB <- data.frame(
  var1 = sample(1:3),
  var2 = sample(1:3),
  var3 = sample(1:3))


dfs <- list(dataframe_AA, dataframe_AB)
combinations <- c("AA", "AB")
oldnames = c("var1", "var2", "var3")

for (df in seq_along(dfs)) {
  for (combi in combinations) {
    newnames = paste(oldnames, substr = substring(combi,1,2), sep = "_")
    df <- df %>% rename_at(vars(oldnames), ~newnames)
  }
  }



#Expected outcome:
names(dataframe_AA)
[1] "var1_AA" "var2_AA" "var3_AA"

names(dataframe_AB)
[1] "var1_AB" "var2_AB" "var3_AB"

newnames已在循环内成功创建,但随后收到错误消息:Error in UseMethod("tbl_vars") : no applicable method for 'tbl_vars' applied to an object of class "c('integer', 'numeric')"

在循环外执行所有操作都是可行的,

df = dataframe_AA
combi = "AA"
newnames = paste(oldnames, substr = substring(combi,1,2), sep = "_")
df <- df %>% rename_at(vars(oldnames), ~newnames)

print(names(df))
[1] "var1_AA" "var2_AA" "var3_AA"


我不明白我在这里做错了什么,以及如何使它循环工作。

1 个答案:

答案 0 :(得分:1)

我们可以使用mget来获取列表中的数据框,然后根据数据框的名称粘贴新变量。

library(dplyr)
library(purrr)



temp <- imap(mget(ls(pattern = "dataframe_.*")), function(x, y) 
          x %>% rename_at(vars(oldnames), ~paste0(., sub(".*_", "_", y))))

temp是名称已更改的数据框的列表,要获取全局环境中的各个数据框,我们可以使用list2env

list2env(temp, .GlobalEnv)

names(dataframe_AA)
#[1] "var1_AA" "var2_AA" "var3_AA"
names(dataframe_AB)
#[1] "var1_AB" "var2_AB" "var3_AB"