在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()
的情况下对多个数据帧进行相同的循环重命名,但这是一个更简单,更直观的选择(我想),我无法理解为什么循环似乎无法实现它。所以,现在我想了解为什么我认为最简单的解决方案似乎是错误的(如果可能的话,如何修复它以使其工作)。
提前致谢!
答案 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)
}