我有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
不同。
答案 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))