【发布时间】:2017-02-22 22:12:29
【问题描述】:
我知道“如何更改数据框列表中的名称”的答案已被多次回答。但是,我一直在尝试生成一个可以将任何列表作为参数并更改列表中所有数据框的所有列名的函数。我正在处理大量 .csv 文件,所有这些文件都将具有相同的 3 列名称。我正在按如下方式导入文件:
# Get a group of drying data data files, remove 1st column
files <- list.files('Mang_Run1', pattern = '*.csv', full = TRUE)
mr1 <- lapply(files, read.csv, skip = 1, header = TRUE, colClasses = c("NULL", NA, NA, NA))
我将有 6 个这样的文件组。如果我在单个列表上运行以下代码,则指定列表中每个数据框中的列名称将正确更改。
for (i in seq_along(mr1)) {
names(mr1[[i]]) <- c('Date_Time', 'Temp_F', 'RH')
}
但是,如果我尝试泛化该函数(参见下面的代码)以将任何列表作为参数,它就无法正常工作。
nameChange <- function(ls) {
for (i in seq_along(ls)) {
names(ls[[i]]) <- c('Date_Time', 'Temp_F', 'RH')
}
return(ls)
}
当我在 mr1(从上面生成的列表)上调用 nameChange 时,它会将列表的全部内容打印到控制台,并且不会更改列表中数据框中的列的名称。我显然在这里遗漏了关于 R 内部工作原理的一些基本知识。我已经尝试了使用和不使用return 的上述功能,并对代码进行了多次修改,但没有一个被证明是成功的。我非常感谢任何帮助,并且真的很想了解问题背后的“原因”。在过去处理将列表作为参数的函数时,我遇到了相当大的麻烦。
非常感谢您提供任何建设性意见。
【问题讨论】:
-
“它将列表的全部内容打印到控制台,并且不会更改列表中数据框中的列名” 听起来你不是分配结果。您需要执行
mr1 <- nameChange(mr1)来分配结果。您也可以将其保存到一个新对象mr1_named <- nameChange(mr1)。 -
除非我在您的问题中遗漏了什么,否则为什么不在 lapply 中使用
setnames()?类似于@Aron Boettcher 的示例:lapply(Your_list, function(x) setnames(x, old = names(x), new =c(new_names)) -
@Gin_Salmon
names <-与setNames是做同一件事的两种方式......我认为这不是真正的问题。 -
嗯。我不知道 setnames() 函数。更简单。
-
FYI for 循环相对于非矢量化 *apply 函数族来说并不是低效的。相反,矢量化的 R 代码通常在 C 或 Fortran 中实现。
names函数如example。