如何在循环中更改数据框中的列名?
How to change column names in dataframe in the loop?
我有 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
)
}
但没有任何改变
我该如何解决这个问题?
assign
的文档说:
x a variable name, given as a character string.
您尝试将它与变量名以外的其他名称一起使用,这似乎不起作用。
我已将您的问题简化为具有三列的三个数据框,只是为了更轻松地创建示例数据。所以这些是数据框:
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)
您可以分三步完成:
--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))
我有 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
)
}
但没有任何改变 我该如何解决这个问题?
assign
的文档说:
x a variable name, given as a character string.
您尝试将它与变量名以外的其他名称一起使用,这似乎不起作用。
我已将您的问题简化为具有三列的三个数据框,只是为了更轻松地创建示例数据。所以这些是数据框:
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)
您可以分三步完成:
--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))