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

时间:2016-07-11 15:56:45

标签: r for-loop dataframe rename

在R中,我有几个具有相同结构的数据帧(3列和几行)。所有数据框都遵循相同的命名约定并具有相同的数据结构,因此可以通过ls(pattern="NamePrefix")调用列出它们。

我想使用for循环重命名所有这些数据帧的第二个和第三个变量。这是我试过的代码:

for (i in ls(pattern="NamePrefix"))
{
    names(i)[[2]] <- "NewName"
    names(i)[[3]] <- "OtherNewName"
}

我还尝试首先将数据框的名称设置为列表(通过File_List <- ls(pattern="NamePrefix")),然后在循环中使用该列表(for (i in File_List)),但这也不起作用。

无论我做什么,我都会收到这个错误:

Error in names(i)[[2]] <- "NewName" :
'names' attribute [2] must be the same length as the vector [1]

但是,如果我只是做names(SomeDataset)[[2]] <- "NewName"完美无缺。但不知何故,for循环似乎无法运行它。

关于它为什么会发生以及如何解决的任何想法?请注意,我很清楚其他几种替代方法,可以在不使用names()的情况下对多个数据帧进行相同的循环重命名,但这是一个更简单,更直观的选择(我想),我无法理解为什么循环似乎无法实现它。所以,现在我想了解为什么我认为最简单的解决方案似乎是错误的(如果可能的话,如何修复它以使其工作)。

提前致谢!

2 个答案:

答案 0 :(得分:2)

因为i将是一个角色对象命名对象,而不是对象本身。我实际上无法想到一个很好的方法来做到这一点;一般建议“我如何对一堆同样命名的对象做xxxx?”是“将这些对象存储在列表中”......

dd <- data.frame(a=1,b=2,c=3)
for (i in ls(pattern="^dd")) {
    g <- get(i)
    names(g)[2:3] <- c("NewName","OtherNewName")
    assign(i,g)
}

可能还有基于(ugh)eval(parse(...))

的解决方案

答案 1 :(得分:2)

#Creating data frames
df1 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df2 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df3 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df4 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))
df5 <- data.frame("V1"=rnorm(10,1,10),"V2"=rnorm(10,1,10),"V3"=rnorm(10,1,10))

# Creating a list of data frames
df_list <- ls(pattern="df")

# Renaming the variables in the data frame
for(i in df_list){
  aux <- get(i)
  names(aux)[2:3] <- c("Vari2","Vari3")
  assign(i,aux)
}