我想在一个循环中更改几个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"
我不明白我在这里做错了什么,以及如何使它循环工作。
答案 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"