使用assign()循环重命名R中的变量

时间:2016-05-30 13:28:39

标签: r loops rename 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"的常规调用中输入数据帧和变量的名称,但不知何故,当我尝试使用assign以便它在循环中完成时,它不会做任何事情。

2 个答案:

答案 0 :(得分:2)

以下是您在环境中对所有data frames进行循环的操作。由于您正在寻找环境中的data frame,因此您可以免除接触任何其他变量的风险。关键是您应该对循环中的每个assign进行data frame次新更改。

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

答案 1 :(得分:1)

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

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