如何在循环中更改数据框中的列名?

How to change column names in dataframe in the loop?

我有 10 个(例如)具有相似名称的数据框,例如 df1、df2、df3,... 有 10 列 我想为每个数据框中的第 10 列命名,例如数据框名称(df1 中的第 10 列必须具有 "df1" 名称,在 df2 中 - "df2" 等)

我试过了

for (i in paste0("df",1:10)){
     assign(names(get(i))[10],
            value=i
            )
     }

但没有任何改变 我该如何解决这个问题?

assign 的文档说:

x a variable name, given as a character string.

您尝试将它与变量名以外的其他名称一起使用,这似乎不起作用。

我已将您的问题简化为具有三列的三个数据框,只是为了更轻松地创建示例数据。所以这些是数据框:

df1 <- data.frame(a = 1:10, b = 1:10, c = 1:10)
df2 <- df1
df3 <- df1

这是更改第三列名称的循环:

for (i in paste0("df",1:3)){
   call <- bquote(names(.(as.name(i)))[3] <- i)
   eval(call)
}

我在这里首先做的是创建调用(您可以查看 call 以了解它包含您实际想要评估的代码行)。 as.name(i) 将字符 i 转换为变量名,而 .() 告诉 bquote 用它们的值替换括号内的已知符号。里面的已知符号是i,会被"df1"代替,然后把字符串转成符号

构造调用后,将使用 eval() 对其进行评估。

我们可以使用Map。用mget('lst')获取list中的数据集,用Map将第10列名改为list('lst1').最好将数据集保留在 list 中,但如果我们需要修改原始数据集对象,请使用 list2env.

 lst <- mget(paste0('df', 1:10))
 lst1 <- Map(function(x,y) {names(x)[10] <- y; x},  lst, names(lst))
 list2env(lst1, envir=.GlobalEnv)

您可以分三步完成:

--get

--改变colnames

-- assign

for (i in paste0("df",1:3)){
  d=get(i)
  colnames(d)[10]=i
  assign(i,d)
}

如果你的命令是在一个字符串中给出的,那么你可以通过eval(parse(text = command))来实现它。

例如,这是可能的:

eval(parse(text = 'names(df1) <- "colname"'))

为每个 data.frame 准备一组命令并不难。我认为在你的情况下,

commands <- sprintf('names(df%d)[10] <- "df%d"', 1:10, 1:10)

然后,

eval(parse(text = commands))