我有一个由两个不同帖子组合而成的问题。
我正在尝试将多个文件 rbind / rbindlist 放在一个文件夹中。与另一个文件相比,我的一些变量在一个文件中的命名不同。我想识别变量标签错误的特定文件。从这里,我可以手动调整各个文件。我可以将 use.names 切换为 FALSE,但列的顺序不正确。因此,当我使用 rbindlist 时,我通常会在末尾获得一系列额外的变量,其中包含某些文件中使用的不同拼写。
names (data1)
id, var1, var2, var3
names (data2)
id, variable1, variable2, variable3
names (finaldata)
id, var1, var2, var3, variable1, variable2, variable3
我认为处理此问题的最佳方法是创建一个新的数据框/文件,其中包含所有不同的文件和相应的变量名称。然后我可以扫描这个新文件并查看哪些原始文件可能需要编辑。
首先,我创建了一个函数来读取单个文件,然后给出文件名和文件中变量的列表。
varnames <- function (file) {
temp <- read_excel (file)
colnames (temp)
x <- colnames (temp)
y <- file
z <- c (y, x)
as.data.frame (z)
}
这会给我以下输出。
varname (data1)
data1
var1
var2
var3
...
接下来,我可以生成所有文件的列表,就像使用 rbindlist 一样。
file.list <- list.files(path = "file_path", pattern='*.xlsx', full.names = FALSE)
从这里,我可以使用 cbind 将所有元素组合在一起。现在我可以使用任何方法来识别错误(扫描新数据文件、创建虚拟变量和子集等)。
cbind(lapply(file.list, varnames))
errors <- cbind(lapply(file.list, varnames))
write.csv (cbind(lapply(file.list, varnames)), "variable_names_across_files.csv")
这是我希望生成的理想输出。
filename. var_1_name var_2_name var_3_name
file1 variable1 var_2 var3
file2 variable1 variable2 variable3
file3 var1 var2 var3
file4 var1 var2 var3
file5 var1 variable2 var3
我提出的解决方案确实有效,但效率很低。这段代码将需要很长时间才能运行。对于上下文,我正在处理大约 2000 个文件,每个文件大约有 120 个案例。由于数据集的最终大小,这可能是不可避免的,但我想看看是否有另一种方法来看待和解决这个问题。
假设每个文件具有相同的列数,首先运行它生成一个矩阵,其中每一行显示一个文件的标题——文件名将是该矩阵的行名称。使用它手动修复列名称以使它们一致。它们不必具有相同的顺序。
Files <- Sys.glob("*.csv")
t(mapply(read.table, Files, sep = ",", nrows = 1))
然后用它来将它们读入一个文件中。
library(plyr)
do.call("rbind.fill", Map(read.csv, as.list(Files)))