R 中具有不同变量名称/位置的 rbindlist:创建输出数据帧/文件

问题描述 投票:0回答:1

我有一个由两个不同帖子组合而成的问题。

合并(rbind)数据框并使用原始数据框的名称创建列

比较R中多个CSV文件的列名

我正在尝试将多个文件 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 个案例。由于数据集的最终大小,这可能是不可避免的,但我想看看是否有另一种方法来看待和解决这个问题。

r data.table compare rbind
1个回答
0
投票

假设每个文件具有相同的列数,首先运行它生成一个矩阵,其中每一行显示一个文件的标题——文件名将是该矩阵的行名称。使用它手动修复列名称以使它们一致。它们不必具有相同的顺序。

Files <- Sys.glob("*.csv")
t(mapply(read.table, Files, sep = ",", nrows = 1))

然后用它来将它们读入一个文件中。

library(plyr)
do.call("rbind.fill", Map(read.csv, as.list(Files)))
© www.soinside.com 2019 - 2024. All rights reserved.