【问题标题】:Function to rename column of each dataframe in a list to its dataframe name将列表中每个数据框的列重命名为其数据框名称的函数
【发布时间】:2019-08-02 10:59:27
【问题描述】:

我有一个结构相同但值不同的数据框列表。我想将每个数据框中的一列重命名为数据框名称,以便稍后将这些单列合并到一个数据框中,并带有一个因子列。

假设我希望重命名 mtcars 中的第 4 列。

mt1 <- mtcars
mt2 <- mtcars
mt3 <- mtcars

mtlist <- list (m1 = mt1,
                m2 = mt2,
                m3 = mt3)

change_column_name <- function(x) {
  aa <- deparse(substitute(x))
  names(x)[4] <- aa 
  return(x)
}

mtlist <- lapply(mtlist, change_column_name)

不是将第 4 列重命名为数据框名称,而是将其重命名为 X[[i]]。以这种方式在函数外部单独重命名列是可行的,那么为什么将它放在函数内部时它不起作用?

【问题讨论】:

    标签: r


    【解决方案1】:

    原因是在lapply 中,change_column_name 的每个元素都被调用,X(在您的情况下是 mtlist)与 X[[i]] 的每个元素一起用于 i = 1...3。有很多方法可以实现您想要的,一种解决方案如下:

    mtlist <- list (mt1 = mt1,
                    mt2 = mt2,
                    mt3 = mt3)
    
    change_column_name <- function(x, aList) {
      dat <- aList[[x]]
      names(dat)[4] <- x
      return(dat)
    }
    
    lapply(names(mtlist), change_column_name, mtlist)
    

    【讨论】:

      【解决方案2】:

      实现预期输出的一种方法是将输入作为列表传递给函数

      change_column_name <- function(x) {
         names(x[[1]])[4] <- names(x) 
         return(x)
      }
      
      lapply(seq_along(mtlist), function(x) change_column_name(mtlist[x]))
      

      或使用Map 并单独传递名称

      change_column_name <- function(x, y) {
         names(x)[4] <- y 
         return(x)
      }
      
      Map(change_column_name, mtlist, names(mtlist))
      

      【讨论】:

      • 好吧,这不是 OP 想要的。他希望它重命名为 data.frame 的名称,并且 为所有第 4 列赋予相同的名称。
      • @thothal 是的,我意识到了这一点。我已经更正了。
      猜你喜欢
      • 2018-01-04
      • 2021-02-22
      • 2021-11-15
      • 2018-06-06
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2019-10-02
      • 2017-12-28
      相关资源
      最近更新 更多