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

问题描述 投票:2回答:4

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

但没有改变我怎样才能解决这个问题?

r loops dataframe assign
4个回答
5
投票

您可以分三步完成:

--get

- 改变colnames

- assign

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"'))

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

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

然后,

eval(parse(text = commands))

1
投票

我们可以使用Map。使用list('lst')获取mget中的数据集,使用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)

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

© www.soinside.com 2019 - 2024. All rights reserved.