我有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
)
}
但是什么都没有改变,我该怎么解决这个问题?
for (i in paste0("df",1:3)){
d=get(i)
colnames(d)[10]=i
assign(i,d)
}
eval(parse(text = command))
来实现它。eval(parse(text = 'names(df1) <- "colname"'))
commands <- sprintf('names(df%d)[10] <- "df%d"', 1:10, 1:10)
eval(parse(text = commands))
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()
进行评估。
Map
。使用mget
('lst')将数据集获取到list
中,使用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)