比较400个不同文件中的列

时间:2017-05-03 21:48:16

标签: r

我有400多个不同的.txt个文件。

他们被命名为FILE20160501.txt, FILE20160502.txt, FILE20160503.txt, ..., FILE20170503.txt

我知道过去添加或删除了一些列。我想检查一下它改变了哪个文件以及它与我现在所处的不同(FILE20170503.txt)。

我的方法:

file_names <- list.files("/data/", pattern = ".*txt")
col_names <- lapply(file_names, 
                    function(x) as.data.frame(fread(x, colClasses = "character",  nrows = 0)))                    

但是我被困在这里。

以下是一个例子:

write.csv(iris, "iris20160501.csv")
write.csv(iris[-1], "iris20170501.csv")
write.csv(iris[-2], "iris20170502.csv")

file_names <- list.files(pattern = "iris.*csv")

col_names <- lapply(file_names, 
                    function(x) as.data.frame(fread(x, colClasses = "character", nrows = 0)))

结果如下:

[[1]]
[1] V1           Sepal.Length Sepal.Width  Petal.Length Petal.Width  Species     
<0 rows> (or 0-length row.names)

[[2]]
[1] V1           Sepal.Length Petal.Length Petal.Width  Species     
<0 rows> (or 0-length row.names)

[[3]]
[1] V1           Sepal.Width  Petal.Length Petal.Width  Species     
<0 rows> (or 0-length row.names)

最后的结果就是我今天所拥有的。我希望能够看到列的更改时间,即iris20170501.csv中的列号与iris20170502.csv不同。

2 个答案:

答案 0 :(得分:1)

您可以修改您编码的位以提取列名称:

col_names <- lapply(file_names, 
                    function(x) colnames(as.data.frame(fread(x, colClasses = "character", nrows = 0))))

包含V1,但这并不重要,因为我们会寻找差异。 假设列表的第二个元素是您的参考文件,要检查其他文件中存在哪些其他列,您可以这样做:

additional=lapply(col_names,function(x) setdiff(x,col_names[[2]]))

返回:

[[1]]
[1] "Sepal.Width"

[[2]]
character(0)

[[3]]
[1] "Sepal.Width"

如果要查找参考文件中存在哪些列而其他文件中缺少哪些列,则可以执行相反的操作:

missing=lapply(col_names,function(x) setdiff(col_names[[2]],x))

给出:

[[1]]
character(0)

[[2]]
character(0)

[[3]]
[1] "Sepal.Length"

编辑:根据Yannis的建议,您可以将文件名中的日期指定为列表元素的名称,以便于访问。

names(additional)=gsub("\\D", "", file_names)
names(missing)=gsub("\\D", "", file_names)

然后以missing$'20160501'为例访问元素。

答案 1 :(得分:0)

尝试使用,或者假设您的列在file_names数据帧中命名为col_1,col_2:

file_names$Boolean_FILE_TEST <- file_names$col_1 ==  file_names$col_2

使用相等运算符&#34; ==&#34;,而不是赋值运算符(=)或者你会弄乱你的数据。这个相等性将遍历您的列并在其旁边写一个列,其中包含&#34; TRUE&#34;如果文件名匹配,或者&#34; FALSE&#34;如果文件名不匹配。

然后,您可以通过该列运行表函数,以查看有多少匹配(TRUE)和多少不匹配(FALSE)。但是你要先偏离顺序,那么它们可能都是错误的。

table(file_names$Boolean_FILE_TEST) 

要查看是否有任何匹配,无论它们是否匹配都会执行类似...

intersect(file_names$col_1, file_names$col_2)

尝试通过长度,表格或摘要传递此内容,以查看有多少匹配。

length(intersect(file_names$col_1, file_names$col_2))

table(intersect(file_names$col_1, file_names$col_2))