计算一系列csv文件的行数

Dou*_*Fir 6 r apply lapply

我正在研究一个R教程并怀疑我必须使用其中一个函数,但我不确定哪个(是的,我研究了它们,但直到我对R术语更加流利,它们都很混乱).

在我的工作目录中有一个文件夹"specdata".Specdata包含数百个名为001.csv - 300.csv的CSV文件.

我正在处理的函数必须计算输入数量的csv文件的总行数.因此,如果函数中的参数是,1:10并且每个文件都有十行,则返回100.

这是我到目前为止所拥有的:

complete <- function(directory,id = 1:332) {
    setpath <- paste("/Users/gcameron/Desktop",directory,sep="/")
    setwd(setpath)
    csvfile <- sprintf("%03d.csv", id)
    file <- read.csv(csvfile)
    nrow(file)
 }
Run Code Online (Sandbox Code Playgroud)

当ID参数是一个数字(例如17)时,这可以工作.但是,如果我输入说10:50作为参数,我收到一个错误:

Error in file(file, "rt") : invalid 'description' argument
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能计算输入ID参数的总行数?

Rom*_*ois 9

read.csv期望只读取一个文件,所以你需要循环文件,这样做的另一种方法是使用sapply:

nrows <- sapply( csvfile, function(f) nrow(read.csv(f)) )
sum(nrows)
Run Code Online (Sandbox Code Playgroud)

例如,这里是您的complete函数的重写:

complete <- function(directory,id = 1:332) {
    csvfiles <- sprintf("/Users/gcameron/Desktop/%s/%03d.csv", directory, id)
    nrows <- sapply( csvfiles, function(f) nrow(read.csv(f)) )
    sum(nrows)
}
Run Code Online (Sandbox Code Playgroud)

  • `length(count.fields(f))`可能比`nrow(read.csv(f))`快很多.(你可以用`system.time`来测试这个假设.) (5认同)