我有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
)
}
但没有改变我怎样才能解决这个问题?
您可以分三步完成:
--get
- 改变colnames
- assign
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"'))
为每个data.frame准备一组命令并不难。我认为在你的情况下,
commands <- sprintf('names(df%d)[10] <- "df%d"', 1:10, 1:10)
然后,
eval(parse(text = commands))
我们可以使用Map
。使用list
('lst')获取mget
中的数据集,使用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)
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()
进行评估。