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

3

我有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
            )
     }

但是什么都没有改变,我该怎么解决这个问题?


1
将所有的数据框放在一个命名列表中,然后遍历这些名称? - Heroka
4个回答

7
你可以通过三个步骤完成它:
- 获取 - 更改列名 - 赋值
for (i in paste0("df",1:3)){
  d=get(i)
  colnames(d)[10]=i
  assign(i,d)
}

4
如果您的命令以字符串形式给出,那么可以通过eval(parse(text = command))来实现它。
例如,这是可能的:
eval(parse(text = 'names(df1) <- "colname"'))

准备每个数据框的一组命令并不那么困难。我认为在您的情况下,
commands <- sprintf('names(df%d)[10] <- "df%d"', 1:10, 1:10)

那么,
eval(parse(text = commands))

1

assign的文档表示:

x是一个变量名,用字符字符串给出。

您尝试使用不是变量名的内容,似乎无法正常工作。

我已经将问题简化为三个数据框,每个数据框有三列,只是为了更容易地创建样本数据。这些是数据框:

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()进行评估。


1
我们可以使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接