【问题标题】:How to change column names in dataframe in the loop?如何在循环中更改数据框中的列名?
【发布时间】:2016-05-07 04:23:06
【问题描述】:

我有 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
            )
     }

但没有任何改变 我该如何解决这个问题?

【问题讨论】:

  • 将所有数据框放在一个命名列表中,然后遍历名称?

标签: r loops dataframe assign


【解决方案1】:

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() 对其进行评估。

【讨论】:

    【解决方案2】:

    我们可以使用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)
    

    【讨论】:

      【解决方案3】:

      你可以分三步完成:

      --get

      --更改colnames

      -- assign

      for (i in paste0("df",1:3)){
        d=get(i)
        colnames(d)[10]=i
        assign(i,d)
      }
      

      【讨论】:

        【解决方案4】:

        如果你的命令是以字符串形式给出的,那么你可以通过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))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-19
          • 2019-08-20
          • 2019-10-20
          • 1970-01-01
          相关资源
          最近更新 更多