我在一个文件夹中有500多个“ .csv”文件。我想计算每个文件中的总行数,因为我想确认我合并的所有文件的合并是否正确。
我尝试使用length(count / fields),但是我想创建一个循环以避免一个接一个地执行。我是R的新手,所以我的编程技能非常基础。有没有办法我可以使用带有files = dir(“ path”)的代码?
length(count.fields(files, skip = 1))
答案 0 :(得分:1)
使用基数R,以下操作应该可以工作(对于大文件,FG7的回复中的fread
比read.csv
快,但是如果很多情况下,read.csv
也可以):>
files<-list.files(your.folder, full.names=TRUE)
file.lengths<-unlist(lapply(file, function(x) nrow(read.csv(files)))#number of rows per file
sum(file.lengths)#total number of rows in all files
答案 1 :(得分:1)
使用count.fields
的优点是它不会将文件加载到内存中。
因此,它应该比使用read.csv
或其他函数更快。
获取文件列表:
files <- list.files(path, full.names=TRUE)
获取每个文件中的行数:
lapply(X = files, FUN = function(x) {
length(count.fields(x, skip = 1))
})
library(rbenchmark)
benchmark("count.fields" = {
lapply(X = files, FUN = function(x) {
length(count.fields(x, skip = 1))
})
},
"read.csv" = {
lapply(X = files, FUN = function(x) {
nrow(read.csv(x, skip = 1))
})
},
"fread" = {
lapply(X = files, FUN = function(x) {
nrow(data.table::fread(x, skip = 1))
})
},
replications = 1000,
columns = c("test", "replications", "elapsed",
"relative", "user.self", "sys.self"))
test replications elapsed relative user.self sys.self
1 count.fields 1000 0.81 1.000 0.28 0.50
3 fread 1000 6.24 7.704 4.57 1.66
2 read.csv 1000 2.93 3.617 2.16 0.76