使用 lapply 更改数据框列表中的列名
Change column names in list of list of data frames using lapply
这是这个问题的后续:
我想更改以下 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 结构中的单行代码,
但我想不出一个好的解决方案。
替代方案可以是(参见 ):
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))
在原始结构中,无需编写更多额外的命名代码。
默认情况下 lapply
循环遍历输入列表元素,因此您无需使用 for 循环索引进行复制。
此外,由于 lapply
的默认输出 class,因此无需在 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
虽然看似方便,但容易出现意外结果
这是这个问题的后续:
我想更改以下 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 结构中的单行代码, 但我想不出一个好的解决方案。
替代方案可以是(参见
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))
在原始结构中,无需编写更多额外的命名代码。
默认情况下 lapply
循环遍历输入列表元素,因此您无需使用 for 循环索引进行复制。
此外,由于 lapply
的默认输出 class,因此无需在 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
虽然看似方便,但容易出现意外结果