[英]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.