如何在一系列csv文件中弹出不匹配的列名?

时间:2019-09-05 06:29:09

标签: r dataframe lapply sapply rbind

我正在读取多个csv文件(20个文件),最后创建一个数据框。尽管我用肉眼手动检查,但列名相同。但是,由于某种原因,我收到以下错误。

  

match.names(clabs,names(xi))中的错误:     名称与以前的名称不符

这是我编写的代码

fnames <- list.files("C:/Users/code",pattern='^La') # getting all the files from directory. Update it as required
csv <- lapply(fnames,read.csv)  # reading all the files
source_DF <- do.call(rbind, lapply(csv, '[', 1:8)) # This is the line where it throws error

请注意,我使用1:8是因为有时R读取的列数不均匀。例如,我所有的csv文件只有8列,但读取时有时有12列,有些甚至有50列。因此,为避免出现1:8的情况。也欢迎使用任何其他方法读取前8列

我如何找出哪个csv文件存在此命名问题以及导致此问题的列有哪些?

任何解决此错误的帮助都将很有帮助

2 个答案:

答案 0 :(得分:2)

我将在此处使用循环,并对照之前的名称检查每组名称:

dfs <- list(
  data.frame(foo = 1, bar = 2),
  data.frame(foo = 2, bar = 2),
  data.frame(foo = 3, baz = 2),
  data.frame(foo = 4, bar = 2)
)

for (i in seq_len(length(dfs) - 1)) {
  different <- names(dfs[[i]]) != names(dfs[[i + 1]])
  if (any(different)) {
    message("Names of column(s) ", paste(which(different), collapse = ", "),
            " in data frame ", i + 1, " differ from the previous ones.")
  }
}
#> Names of column(s) 2 in data frame 3 differ from the previous ones.
#> Names of column(s) 2 in data frame 4 differ from the previous ones.

或者,如果您只想存储不匹配项:

mismatches <- list(integer())
for (i in seq_len(length(dfs) - 1)) {
  different <- names(dfs[[i]]) != names(dfs[[i + 1]])
  mismatches[[i + 1]] <- which(different)
}

str(mismatches)
#> List of 4
#>  $ : int(0) 
#>  $ : int(0) 
#>  $ : int 2
#>  $ : int 2

reprex package(v0.3.0.9000)于2019-09-05创建

答案 1 :(得分:1)

一种检查方法是对每个数据帧的前8列进行子集化,获取所有数据帧中的通用名称,然后使用setdiff来确定列名称是否不匹配

list_df <- lapply(csv, '[', 1:8)
cols <- Reduce(intersect, lapply(list_df, names))
lapply(list_df, function(x) setdiff(names(x), cols))

如果所有列名都相同,则每个数据帧的输出应为character(0)。如果存在任何不匹配,setdiff将显示该列的名称。

要检查的另一个提示是length(cols) 8吗?