使用assign()函数在R中循环重命名变量

3

我尝试在多个数据框中重命名变量,但assign函数无法正常工作。以下是我尝试的代码:

assign(colnames(eval(as.name(DataFrameX)))[[3]], "<- NewName")
# The idea is, go through every dataset, and change the name of column 3 to
# "NewName" in all of them

这不会返回任何错误(我能想到的所有其他版本都会返回某种错误),但它也不会更改变量名。

我正在使用循环创建多个数据框和每个数据框内的不同变量,现在我需要重命名其中一些变量,以便稍后可以将这些数据框合并为一个。所有这些都可以正常工作,除了重命名。如果我自己输入数据框和变量的名称进行常规调用并使用colnames(DF)[[3]] <- "NewName"重命名,则一切正常,但是当我尝试使用赋值来执行循环时,它似乎没有做任何事情。


你有一个数据框(data frame)的列表吗?或者你所拥有的变量的类别是什么?其中包含了多个数据框(data frame)? - 989
它们不在列表中,也没有分组到任何其他变量下。它们都是独立的、独立存在的数据框架(我看到最好的方法似乎是使用数据框架列表,但我希望有一个不使用它们的解决方案)。 - user3620237
我感谢所有的回答,但如果有人能告诉我为什么赋值调用不起作用,那也太好了。 - user3620237
阅读help("assign")。不清楚您编写代码的原因以及为什么认为它应该工作。此外,出于很好的原因,建议使用列表。不要让编码变得比必要的更加困难。 - Roland
2个回答

2
这是你可以使用循环遍历环境中所有数据框的方法。由于你只寻找环境中的数据框,因此免受触及其他变量的风险。重点是你应该在循环内为每个数据框分配新更改。请保留HTML标签。
df1 <- data.frame(q=1,w=2,e=3)
df2 <- data.frame(q=1,w=2,e=3)
df3 <- data.frame(q=1,w=2,e=3)

# > df1
  # q w e
# 1 1 2 3
# > df2
  # q w e
# 1 1 2 3
# > df3
  # q w e
# 1 1 2 3

DFs=names(which(sapply(.GlobalEnv, is.data.frame)))
for (i in 1:length(DFs)){
    df=get(paste0(DFs[i]))
    colnames(df)[3]="newName"
    assign(DFs[i], df)
}

# > df1
  # q w newName
# 1 1 2       3
# > df2
  # q w newName
# 1 1 2       3
# > df3
  # q w newName
# 1 1 2       3

谢谢!我的工作区里还有其他数据框,所以为了节省精力,我会尝试重新编写它,使其仅调用具有特定命名结构的数据框,但对于其余部分,它可以完成任务。 - user3620237
在这种情况下,您可以使用grep和所需的regex模式来过滤掉DFs。即:DFs = grep("想要的正则表达式模式", DFs, value = TRUE) - 989

1

我们可以尝试使用?eapply()data.table包中的setnames()应用于全局环境中的所有data.frame

library(data.table)
eapply(.GlobalEnv, function(x) if (is.data.frame(x)) setnames(x, 3, "NewName"))

我在我的环境中有很多其他变量和数据框,我宁愿不做任何可能触及它们的事情,但我会尝试使用setnames - user3620237
1
为什么不将相关的data.frame保存在一个列表中,然后使用lapply呢? - mtoto
我建议您更新一下问题,因为目前您的说法是“#The idea is, go through every dataset”,因此采用eapply方法。 - mtoto

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