簡體   English   中英

使用lapply更改數據幀列表列表中的列名

[英]Change column names in list of list of data frames using lapply

這是該問題的后續內容: 使用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))

而不是我笨拙的結構中的“測量”,但這似乎不起作用。

我當前的解決方法是一個嵌套循環,它(重新)分配列名:

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結構中使用一個內襯,但是我無法提出一個好的解決方案。

一種替代方法是(請參閱使用lapply更改數據幀列表的列名 ):

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)沒有真正做應做的事情(僅保留了最后一個list元素)2)也不整潔

優選地,我想使用類似

eval(parse(text = myvar))

在原始結構中,而不必編寫更多的其他命名代碼。

默認情況下, lapply循環遍歷輸入列表元素,因此您無需使用for循環索引進行重復。 另外,由於lapply的默認輸出類是list對象,因此lapply在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看起來很方便,但很容易出現意外結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM