【问题标题】:Change column names in list of list of data frames using lapply使用 lapply 更改数据框列表中的列名
【发布时间】:2017-08-14 20:22:35
【问题描述】:

这是这个问题的后续:Create scatter plot with interval data in R

我想更改以下 data.frames 中的列名,它们是列表列表的一部分:

other_list #a list of arbitrary length containing some data
myvar <- "myactualMeasurement"

lapply_output <- list()
for(i in 1:length(other_list)){
  lapply_output[[i]] <- lapply(other_list[[i]], function(item){
      out_df <- data.frame('MyItem' = item$MyItem,
                           'Measurement' = item$Measurement,
                           'Interval' = seq(floor(item$First), floor(item$Last))+ 0.5)
      return(out_df)
  })
}

如您所见,我将名称“MyItem”、“Measurement”和“Interval”分配给我的列。 我想使用变量“myvar”而不是手动分配名称“Measurement”。 我已经尝试过使用

eval(parse(text = myvar))

而不是我的 lapply 结构中的“测量”,但这似乎不起作用。

我当前的解决方法是一个嵌套循环,它(重新)分配列名:

for(i in 1:length(other_list)){
  for(j in 1:length(lapply_output[[i]])){
    colnames(lapply_output[[i]][[j]])[which(names(lapply_output[[i]][[j]]) == "Measurement")] <- myvarpar
  }
}

我敢肯定,必须有一种更简洁的方式来做到这一点(最好是 lapply 结构中的 oneliner, 但我想不出一个好的解决方案。

替代方案可能是(参见Using lapply to change column names of a list of data frames):

new_col_name <- c("MyItem", myvar, "Interval")
for(i in 1:length(other_list)){
  newlist[[i]] <- lapply(lapply_output[[i]], setNames, nm = new_col_name)
}

但这是 1)没有真正做它应该做的(只保留最后一个列表元素) 2) 也不整洁

我最好使用类似的东西

eval(parse(text = myvar))

在原始结构中,无需编写更多额外的命名代码。

【问题讨论】:

    标签: r dataframe eval lapply columnname


    【解决方案1】:

    默认情况下,lapply 循环遍历输入列表元素,因此您无需使用 for 循环索引进行复制。 此外,由于默认输出类为 lapply,因此无需在 lapply 之前创建一个虚拟列表 是一个list 对象

    您可以使用match 来比较列名,如下所示一步重命名列名

    outputVar <- "myactualMeasurement"
    inputVar <- "Measurement"
    
    outList = lapply(other_list, function(item){
    
          out_df <- data.frame('MyItem' = item$MyItem,
                               'Measurement' = item$Measurement,
                               'Interval' = seq(floor(item$First), floor(item$Last))+ 0.5)
    
          inputvarIndex <- match(inputVar,colnames(out_df))
          colnames(out_df)[inputvarIndex] <- outputVar
    
          return(out_df)
      })
    

    我强烈建议仔细阅读?lapply 的文档和示例,并注意eval/parse 虽然看似方便,但很容易受到意外结果的影响

    【讨论】:

    • 非常感谢!这确实有效。当我将应用函数应用于列表列表时,循环是必要的,即。 e.到嵌套在另一个列表中的列表。我现在意识到,我没有正确解释这一点。感谢您的帮助!
    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多