我正在读取多个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文件存在此命名问题以及导致此问题的列有哪些?
任何解决此错误的帮助都将很有帮助
答案 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吗?