R语言 使用lapply更改数据框列表中的列名

uwopmtnx  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(205)

这是这个问题的后续: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结构中的'Measurement',但这似乎不起作用。
我目前的解决方法是一个嵌套循环,它(重新)分配列名:

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结构中的一行代码,但我无法提出一个好的解决方案。
另一种可能是(见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))

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

brgchamk

brgchamk1#

默认情况下,lapply循环输入列表元素,因此不需要复制for循环索引。另外,由于lapply的默认输出类是list对象,因此不需要在lapply之前创建一个伪列表
您可以通过一个步骤重命名列名,如下所示,使用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虽然看起来很方便,但却容易出现意外的结果

相关问题